如何以编程方式注册AbstractMongoEventListener?

时间:2016-05-18 10:44:47

标签: java spring mongodb spring-data

在我的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());
        }
    }
}

我发现听众被实例化是令人惊讶的。特别是因为它在客户存储库的调用完成后很好地实例化了。

有没有办法防止这种情况发生?我正在考虑以编程方式为每个表/范围注册它,而不使用注释魔法。

1 个答案:

答案 0 :(得分:1)

要防止自动实例化,不得将侦听器注释为@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