DD.
DD.

Reputation: 21981

Spring config - best practise with initialization code

@Bean
public Session session(){
    SessionConnector connector=new SessionConnector(url,username,password,environment);
    Session session= connector.getSession();
    session.registerListener(listener());

    return session;
}
@Bean
public Listener listener(){
   return new Listener(session())
}

I have the code above which ends up running an endless loop...How can I separate the registration of the listener into a separate method? (I tried creating a temporary private Session bean without the registration code but for some reason you cant have private beans?)

Thxs.

Upvotes: 1

Views: 316

Answers (2)

aweigold
aweigold

Reputation: 6879

I like to use the following pattern just to make sure beans are not instantiated more than once. You still obviously however need to remove the cyclic dependency.

@Bean
public Session session(){
    if (session == null) {
        SessionConnector connector=new SessionConnector(url,username,password,environment);
        session= connector.getSession();
    }
    return session;
}
@Bean
public Listener listener(){
   if (listener == null) {
       Session session = session();
       listener = new Listener(session);
       session.registerListener(listener);
   }
   return listener;
}

private Session session;
private Listener listener;

Upvotes: 1

Alexander Pogrebnyak
Alexander Pogrebnyak

Reputation: 45576

Listener does not have to be a @Bean.

You can call a regular Listener constructor and pass a session.

Here is modified code:

@Bean
public Session session(){
    SessionConnector connector=
      new SessionConnector(url,username,password,environment);
    Session session= connector.getSession();

    // This is modified initialization code
    Listener listener = new Listener( session );
    session.registerListener(listener);

    return session;
}

EDIT
If you need to have listener as a singleton, then I suggest you register it with the session in its initialization code.

@Bean
public Session session(){
    SessionConnector connector=
      new SessionConnector(url,username,password,environment);
    Session session= connector.getSession();

    return session;
}

@Bean
public Listener listener(){
   Session session = session( );
   Listener listener = new Listener( session );

   session.registerListener( listener );

   return listener;
}

Upvotes: 2

Related Questions