Spring IoC容器 - 定义对使用特定注释注释的类的依赖性?

时间:2013-07-29 12:27:07

标签: spring

我有一个bean,它扫描带有特定注释(特定于域的注释)的类。我想确保所有使用@MyDomainAnnotation注释的bean在bean扫描注释为@MyDomainAnnotation的bean之前进行初始化和实例化。

有没有办法定义这样的依赖,因为这是框架的一部分,因此新类可能会“插入”。基本上我事先并不知道班级的名字。

2 个答案:

答案 0 :(得分:1)

在扫描bean上实施ApplicationListener<ContextRefreshedEvent>

public class MyScanningBean implements ApplicationListener<ContextRefreshedEvent> {

  private boolean scanned = false;

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    /* Published when the ApplicationContext is initialized or refreshed,
     * for example, using the refresh() method on the
     * ConfigurableApplicationContext interface. "Initialized" here means
     * that all beans are loaded, post-processor beans are  detected and
     * activated, singletons are pre-instantiated, and the
     * ApplicationContext  object is ready for use. */

    if (!scanned) {
      // scan for beans
      scanned = true;
    }
  }
}

请参阅http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-functionality-events

答案 1 :(得分:0)

虽然我选择实现ApplicationListener作为@Tichodroma建议我也找到了另一个解决方案,如果你需要对bean的初始化顺序进行更细粒度的控制,有时可能会出现这种情况。因此,实现SmartLifecycle,您可以提供相位值,该值将确定实例化bean的顺序(按升序排列)(即,将首先初始化具有最小相位值的bean)。

但无论如何,我认为上面的答案在我的情况下更优雅和干净。