Автомонтирование неуправляемых компонентов, аннотированных с помощью @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-configured в конфигурации 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 {
    ...
}

Есть что-то, что мне не хватает?

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


person Alex Beardsley    schedule 16.06.2009    source источник
comment
Что говорит журнал? Упоминается ли в нем автоматическое обнаружение bean-компонентов в пакете foo? В журнале отладки должно быть указано, какие bean-компоненты @Component были найдены.   -  person skaffman    schedule 17.06.2009
comment
Между прочим, для того, что вы хотите сделать, не нужны вещи, настроенные для аспектов/ткачества/спринга. Это просто базовая автопроводка.   -  person skaffman    schedule 17.06.2009


Ответы (3)


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

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

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

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

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

person Michael Wiles    schedule 17.06.2009
comment
Полное непонимание терминологии с моей стороны. Отличный ответ. Спасибо! - person Alex Beardsley; 17.06.2009
comment
Вы можете смешивать конфигурацию xml и аннотации. - person banterCZ; 08.08.2012
comment
@banterCZ да... Я заметил это сейчас - person Michael Wiles; 18.09.2013

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

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

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

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

person Jon Vaughan    schedule 25.10.2010

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

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

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

person Vishal Makwana    schedule 21.05.2012
comment
В конфигурации xml все bean-компоненты могут быть объявлены где угодно, порядок не имеет значения. - person рüффп; 10.09.2013