Автопроводка неуправляемых бобов, аннотированных с помощью @Component - PullRequest
7 голосов
/ 17 июня 2009

Я хочу использовать @AutoWired для внедрения неуправляемого компонента, настроенного с помощью @Component, в управляемый компонент. Я почти уверен, что у меня правильная конфигурация, но по некоторым причинам я продолжаю получать исключение:

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean

Судя по ошибке, я не могу найти класс Baz, но не знаю почему. Насколько я понимаю, элемент context: spring в конфигурации XML должен был позволить мне сделать это. Я также включил соответствующие файлы jar (spring-weaving.jar и aspectjweaver.jar).

Вот простой пример моей установки.

Моя конфигурация XML:

<beans ...>
    ...

    <context:annotation-config/>
    <context:spring-configured/>
    <context:component-scan base-package="foo"/>

    <bean id="bar" class="foo.Bar"/>
    ...
</beans>

У меня есть один управляемый компонент:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

    public void setBaz(Baz baz) {
        this.baz = baz;
    }

    ...
}

И один неуправляемый боб:

package foo;

@Component
public class Baz {
    ...
}

Есть ли что-то, что я пропускаю?

РЕДАКТИРОВАТЬ : В журнале перечисляются компоненты, для которых он создается, и foo.Baz не является одним из них. Я не знаю, почему он не получает аннотированный класс @Component.

Ответы [ 3 ]

11 голосов
/ 17 июня 2009

Поскольку Bar настроен с использованием XML, он может быть настроен только с XML. то есть вы не можете смешивать их. Так что аннотация «@Autowired» на Baz не поднимается (ни одна из аннотаций не будет). Только когда вы добавляете аннотацию Spring на уровне класса, Spring будет прослушивать любые другие аннотации.

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

<bean id="bar" class="foo.Bar" autowire="byType"/>

Еще одна вещь, когда вы аннотируете бин с помощью @Component, он является бином с пружинным управлением. То, что он не создан с помощью XML, не означает, что он неуправляемый. Неуправляемый боб - это тот, который вы не получаете с весны.

Бар и Баз управляются пружиной. Это механизм, который вы выбрали, чтобы определить их, которые отличаются.

6 голосов
/ 25 октября 2010

Предыдущий ответ неверен, в одном аспекте. Вы можете автоматически передавать bean-компоненты, которые в противном случае настроены с помощью XML.

Из раздела 3.4.5 в http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:

При использовании метаданных конфигурации на основе XML [2] вы задаете режим автоматического подключения для определения компонента с атрибутом autowire элемента. Функциональность автопроводки имеет пять режимов. Вы указываете автопроводку для одного компонента и, таким образом, можете выбирать, какие из них использовать.

Вы можете автоматически связывать по имени, типу и конструктору. Вот грубый пример этого: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

0 голосов
/ 21 мая 2012

Ошибка связана с последовательностью bean-компонентов, определенных в файле конфигурации XML.

Как и в вашем XML-файле, сначала создается bean-компонент для bar, а затем его зависимые bean-компоненты, из-за которых @Autowired не может найти baz.

Сначала вы должны объявить bean для baz, а затем для bar.

...