Конфигурируемый против компонента с Spring и AspectJ

При использовании AspectJ зачем использовать @Component вместо @Configurable.

У меня есть настройка Spring и AspectJ для поддержки @Transactional, аспектов самовызова и внедрения в сущности JPA. Это прекрасно работает.

Я использую @Component для большинства классов, которым требуется инъекция, и, таким образом, либо внедряю их в свои зависимости. Или, когда я не могу, внедряю ApplicationContext, а затем использую getBean() в качестве последнего средства. И я резервирую @Configurable только для объектов JPA (Hibernate), которым требуется инъекция. Я также начал использовать @Configurable для тестов jUnit, чтобы упростить написание тестов. Это также отлично работает.

Но мне любопытно. Если AspectJ теперь автоматически внедряет (обогащает) что-либо с помощью аннотации @Configurable, независимо от того, как она построена; getBean(), new(), @Autowired. Почему бы мне просто не переключиться на использование @Configurable для всех моих bean-компонентов? Тогда я могу полностью отказаться от контекста приложения и getBean() и просто использовать new() для любых классов, которые я не могу внедрить.

Я понимаю, что я не упомянул конфигурацию компонента XML. Я не уклоняюсь от этого, но этот проект не требует этого. Я просто конструктор или установщик ввожу зависимости при тестировании. очень просто.


person DragonFax    schedule 20.05.2009    source источник


Ответы (3)


Одна из причин, по которой вам не следует всегда использовать @Configurable, заключается в том, что это добавляет много накладных расходов: запуск приложения часто занимает гораздо больше времени, а создание новых экземпляров становится медленнее.

Для @Component вам это вообще не нужно, потому что обычно все экземпляры управляются Spring.

person Ilya Boyandin    schedule 16.06.2009

@Component — это интерфейс маркера Spring, который может дать Spring подсказки, когда дело доходит до автоматического обнаружения bean-компонентов.

@Configurable — это маркер, используемый средствами АОП, связанными с временем загрузки.

Эти двое на самом деле не имеют большого отношения друг к другу.

person skaffman    schedule 16.06.2009

@Component предназначен для классов, экземпляры которых будут созданы самим Spring, а @Configurable — для классов, экземпляры которых будут созданы вашим собственным кодом или другой структурой — например, сущностями с помощью Hibernate или сервлетов с помощью контейнера сервлетов.

person Daniel Serodio    schedule 26.06.2012