Автопроводка неуправляемых бобов, аннотированных с помощью @Component

StackOverflow https://stackoverflow.com/questions/1004278

Вопрос

Я хочу использовать @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.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Предыдущий ответ неверен в одном аспекте. Вы можете автоматически передавать 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/ Код / Java / Spring / AutoWiring.htm

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

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

Сначала необходимо объявить bean-компонент для baz , а затем для bar .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top