Spring область autowire и prototype

У меня есть класс с именем Bar со следующей аннотацией: @Configurable(autowire = Autowire.BY_TYPE)

В частном члене у меня есть следующая аннотация:

@Autowired(required = true)
private Foo foo;

В конфигурации spring у меня есть bean класса Foo. Если bean определяется с помощью scope="prototype", он не работает, и я получаю следующее исключение:

NoSuchBeanDefinitionException: нет соответствия bean типа Foo, найденного для зависимости:     ожидаемый как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости

Как только я сменил введенную область bean на "singleton", она отлично работает.

Не разрешена ли автоматическая проводка допустимого прототипа bean?

Есть ли способ обхода (помимо получения bean вручную)?

Спасибо заранее, Авнер

Ответ 1

Следующие ссылки предоставляют альтернативные решения для таких сценариев:

Первая ссылка рассказывает о добавлении в Foo:

@Component
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
class Foo

Что вызовет новый экземпляр каждого вызова.

Ответ 2

Я считаю, что это прототип/синглтон, объявленный в вашем xml, для этой проблемы bean.

Не разрешена ли автоматическая проводка допустимого прототипа bean?

Я думаю, что это запрещено. Логика заключается в том, если она разрешена, то всякий раз, когда вы используете этот класс, тогда ему необходимо повторно установить этот bean всегда как свое поле. Что странно, особенно если класс, который этот bean является autowired как поле, является одним и тем же.

Есть ли способ обхода (помимо получения bean вручную)?

Просто попробуйте удалить атрибут scope, потому что если он имеет атрибут prototype, он не будет восстановлен. Если эти beans (службы и DAO) объявлены в вашем контексте приложения, просто позвольте аннотации autowire получить его как singleton, поскольку по умолчанию beans являются singleton, что и должно быть.

Ответ 3

Если введенная область bean является "Singleton", тот же экземпляр bean будет автоматически подключен. Если введенная область bean 'prototype', новый экземпляр будет создан как часть процесса автоматической проводки.

Какую версию Spring вы используете, а также добавьте spring -context.xml для более подробной информации.

Ответ 4

или вы можете просто использовать новый оператор.