Spring配置 - 初始化代码的最佳实践

时间:2012-01-02 23:48:08

标签: java spring

@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())
}

我上面的代码最终会运行无限循环...如何将侦听器的注册分成单独的方法? (我尝试创建一个没有注册码的临时私有Session bean但由于某种原因你不能拥有私有bean?)

Thxs。

2 个答案:

答案 0 :(得分:2)

Listener不一定是@Bean

您可以调用常规Listener构造函数并传递会话。

以下是修改后的代码:

@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;
}

修改
如果你需要将监听器作为单例,那么我建议你在初始化代码中用会话注册它。

@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;
}

答案 1 :(得分:1)

我喜欢使用以下模式来确保bean不会多次实例化。显然,你仍然需要删除循环依赖。

@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;