2010-06-03 2 views
2

Я использую конфигурацию Spring на основе Java в своем проекте, указав создание компонента в @ Bean-аннотированных методах в @Configuration. Недавно, недавно, я начал думать, что, возможно, было бы лучше использовать @Autowired для удаления всех не важных компонентов из @Configuration, оставив только небольшой «корневой» набор из них (ключевые сервисы и технические бобы, подобные тем, Spring MVC).Как использовать @Autowired с конфигурацией на основе Java?

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

Есть ли какой-либо способ использования @ Упомянутый Java-конфигурация без явного указания каждого компонента?

+2

'@ Autowired' работает нормально в обычных конфигурациях' @ Bean', компонентное сканирование не требуется (или даже желательно). Просьба привести пример того, что у вас есть. – skaffman

+0

Например, у меня есть служба @Bean MyService, которая имеет '@Autowired IDao dao'. Существует «интерфейс IDao» и «класс DaoImpl реализует IDao», и для «IDao» нет других реализаций. Насколько я понимаю, необходимо либо объявить '@Bean IDao dao() {return new DaoImpl }', либо использовать сканирование компонентов. В противном случае я получаю 'Совпадающий компонент типа IDao для исключения зависимости '. – Fixpoint

+0

Вы можете выполнить компонентное сканирование с помощью '@ ComponentScan'. Нет необходимости в XML. – Nick

ответ

4

Если вы правильно поняли, вы ожидаете, что Spring автоматически обнаружит класс DaoImpl на основе зависимой от автозависимости зависимости от интерфейса Dao.

Этого не произойдет - вам нужно либо использовать сканирование компонентов, либо вам нужно явно объявить компонент, либо как <bean>, либо @Bean.

Причина в том, что Java не предоставляет механизма для обнаружения классов, которые реализуют данный интерфейс, загрузчик классов просто не работает.

+0

Спасибо, это то, что я хотел знать. – Fixpoint

+0

как это можно сделать? – prashu132

0

Если вы реализуете Idao через dao, и вы ищете @Autowire эту зависимость в вашей ссылке var ... вам нужно сначала: определить компонент, чтобы вы (в Java на основе конфигурации) просто возвращали класс impl к интерфейсу. Имя компонента - имя вашего метода.

Когда вы выполните автоподтверждение, он будет искать подходящее имя между вашей ссылочной переменной, которую вы ищете, для автовыставки и вашей декларации.

THEN вы будете в порядке. Надеюсь это поможет.

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