我有一个 bean,它扫描使用特定注释(特定于域的注释)注释的类。我想确保所有带有注释@MyDomainAnnotation
的bean在扫描带有注释的bean之前被初始化和实例化@MyDomainAnnotation
。
有没有办法定义这种依赖关系,因为这是框架的一部分,因此可能会“插入”新类。基本上我事先不知道班级的名字。
我有一个 bean,它扫描使用特定注释(特定于域的注释)注释的类。我想确保所有带有注释@MyDomainAnnotation
的bean在扫描带有注释的bean之前被初始化和实例化@MyDomainAnnotation
。
有没有办法定义这种依赖关系,因为这是框架的一部分,因此可能会“插入”新类。基本上我事先不知道班级的名字。
ApplicationListener<ContextRefreshedEvent>
在您的扫描 bean 上实现。
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;
}
}
}
尽管我选择按照@Tichodroma 的建议实现 ApplicationListener,但我还找到了另一种解决方案,如果您需要对 bean 的初始化顺序进行更细粒度的控制,有时可能就是您想要的。因此,实现SmartLifecycle您可以提供阶段值,这些值将确定您的 bean 实例化的顺序(按升序排列)(即,具有最小阶段值的 bean 将首先被初始化)。
但无论如何,我认为上述答案在我的情况下更加优雅和干净。