2016-05-18 3 views
0

В моем приложении загрузки Spring у меня есть конфигурация, которая считывает записи из базы данных Mongo.Как регистрировать AbstractMongoEventListener программно?

После этого будет создан мой подкласс 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()); 
     } 
    } 
} 

Я нахожу это удивительным, что слушатель инстанциируется вообще. Тем более, что он был создан после завершения вызова в хранилище клиентов.

Есть ли способ предотвратить это? Я думал о программной регистрации его в таблице/области, без магии аннотаций.

ответ

0

Чтобы предотвратить автоматическое создание, слушатель не должен быть аннотирован как @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.

Смежные вопросы