2009-05-20 8 views
8

При использовании AspectJ, зачем использовать @Component поверх @Configurable.Конфигурируемый компонент vs с пружиной и AspectJ

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

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

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

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

ответ

1

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

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

12

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

@ Конфигурируемый - это маркер, используемый компонентом AOP load-time-weaving.

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

6

@Component предназначен для классов, которые будут созданы экземпляром самой весной, а @Configurable - для классов, которые будут создаваться, например, вашим собственным кодом или другими объектами инфраструктуры Hibernate или Servlets контейнером сервлета.