Пружинный автопровод и прототип прицела - PullRequest
12 голосов
/ 22 марта 2012

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

На приватном члене у меня есть следующая аннотация:

@Autowired(required = true)
private Foo foo;

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

NoSuchBeanDefinitionException: не найден соответствующий компонент типа Foo для зависимости: ожидается, что по крайней мере 1 bean-компонент считается кандидатом autowire для этой зависимости

Как только я изменяю объем введенного компонента на "singleton", он работает нормально.

Разрешено ли автоматическое подключение прототипа bean-объекта?

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

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

Ответы [ 3 ]

12 голосов
/ 18 июля 2012

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

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/

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

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

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

0 голосов
/ 15 июля 2012

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

Разрешено ли автоматическое подключение прототипа bean-объекта?

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

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

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

0 голосов
/ 22 марта 2012

Если введенная область действия компонента - «Синглтон», тот же экземпляр компонента будет автоматически подключен.Если внедренная область действия bean-компонента - «prototype», новый экземпляр будет создан как часть процесса автоматического подключения.

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

...