Автопроводка Неуправляемых Бобов С Аннотацией @Component


Я хочу использовать @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-configed в XML config должен был позволить мне сделать это. Я также позаботился о том, чтобы включить соответствующие файлы 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 {
    ...
}
Есть ли что-то, что я упускаю?

EDIT : в журнале перечислены бобы, которые он создает, и foo.Баз-не один из них. Я не знаю, почему он не берет аннотированный класс @Component.

3 7

3 ответа:

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

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

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

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

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

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

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

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

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

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

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

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