在我的Spring Boot应用程序中,我有一个配置,可以从Mongo数据库中读取条目。
完成此操作后,即使我的AbstractMongoEventListener
子类在不同的表和不同的范围(我自己的自定义@CustomerScope
)上运行,它也会被创建。
这是监听器:
@CustomerScoped
@Component
public class ProjectsRepositoryListener extends AbstractMongoEventListener<Project> {
@Override
public void onAfterSave(Project source, DBObject dbo) {
System.out.println("saved");
}
}
这是配置:
@Configuration
public class MyConfig {
@Autowired
private CustomersRepository customers;
@PostConstruct
public void initializeCustomers() {
for (Customer customer : customers.findAll()) {
System.out.println(customer.getName());
}
}
}
我感到惊讶的是,监听器完全实例化了。尤其是由于在完成对客户存储库的调用后已很好地实例化了它。
有办法防止这种情况吗?我正在考虑以编程方式在每个表/范围内注册它,而没有注释魔术。
最佳答案
为防止自动实例化,不得将侦听器注释为@Component
。该配置需要保留可自动装配的ApplicationContext。
因此,我的配置类如下所示:
@Autowired
private AbstractApplicationContext context;
private void registerListeners() {
ProjectsRepositoryListener firstListener = beanFactory.createBean(ProjectsRepositoryListener.class);
context.addApplicationListener(firstListener);
MySecondListener secondListener = beanFactory.createBean(MySecondListener.class);
context.addApplicationListener(secondListener);
}
请注意,这适用于任何
ApplicationListener
,而不仅仅是AbstractMongoEventListener
。