2012-03-22 2 views
10

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

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

@Autowired(required = true) 
private Foo foo; 

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

NoSuchBeanDefinitionException: Нет соответствия боб типа Foo не найдено для зависимости: ожидается, по крайней мере один боб, который квалифицируется как autowire кандидата на этот Зависимость

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

Не разрешена ли автоматическая проводка прототипа с фасолью?

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

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

+0

http://www.stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 –

ответ

9

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

  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

Замечательно, что вы написали, но было бы лучше, если бы вы просто напишите, что нужно настроить его с прокси-сервером :) – tomekK

+0

Ответы только на связь плохие, что произойдет, если данные ссылки исчезнут? –

-1

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

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

+1

Я знаю различия между прототипом и синглтоном, я просто не понимаю, почему bean scope влияют на автоматическую проводку. Я использую весну 3. –

0

Я считаю, что его прототип/одноэлементная вещь, заявленная в вашем xml для этого компонента, является проблемой.

Не допускается ли автоматическая проводка прототипа боба?

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

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

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

+0

Спасибо за ваш ответ, но удаление атрибута области не будет исправлять мой код, так как все экземпляры Bar будут иметь один и тот же экземпляр Foo, который мне не нужен. В дополнение, экземпляр Foo должен быть инстанцирован один раз за создание/вложение объекта в баре, а не за использование поля (насколько я понимаю). –

+0

Я не знаю, есть ли альтернатива для вашего конкретного дизайна, скажите мне, есть ли. Но что касается дизайна, beans следует использовать без апатрида, это значит быть осторожным в ваших полях, убедитесь, что поля используются в этих бобах не глобальными полями, а полями методов, таким образом, даже это одноэлементный, вы выиграли Не беспокойтесь, если он разделяется многими классами, поскольку глобальная переменная не используется совместно, потому что она не имеет статуса. – vine

-2

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

+1

Это полностью поражает всю цель DI и IOC. – csmckelvey