2015-12-10 4 views
0

Первый раз, используя Spring с аннотациями. Я пытаюсь определить одноэлементный компонент, как:Понимание Spring4 аннотация бобы

@Bean 
public ActionProducer actionProducer() { 
    return new ActionProducer(); 
} 

Но я чувствую, что это не правильный способ сделать так возвращает «новые» компоненты-каждый раз. Должен ли я определить, как показано ниже?

@Bean 
public ActionProducer actionProducer() { 
    if (bean==null) 
     bean=new ActionProducer(); 
    return bean 
} 

Заранее спасибо.

ответ

1

@Configuration Для каждого класса, Spring создает прокси-сервер, который контролирует вызовы этих методов @Bean. Поэтому, если у вас есть метод @Bean, который должен создать одноэлементный компонент (который он делает по умолчанию, если вы не укажете другую область) прокси-сервер удостоверится, что метод вызывается только один раз для создания компонента. Все дальнейшие вызовы перехватываются прокси, и уже существующий bean-компонент будет возвращен.
Таким образом, можно даже просто вызвать этот метод фасоли, если у вас есть другие бобы в этом классе, которые зависят от него, не думая о прицелах, дублируют экземпляры и др .:

@Bean 
public AnotherClass anotherClass() { 
    return new AnotherClass(actionProducer()); 
} 

Так не работаю вокруг функциональности Spring и просто реализовать метод следующим образом:

@Bean 
public ActionProducer actionProducer() { 
    return new ActionProducer(); 
} 
+0

это очень близко к моему вопросу. другой bean-компонент (в том же классе конфигурации), введенный actionProducer, получает другой объект ref. – Emre

+0

Обычно вы не вводите сам экземпляр bean, а вместо него прокси-сервер, и каждый прокси-сервер представляет собой другой объект, а значит, иную ссылку. Но прокси-серверы приведут к тому же экземпляру bean, если это синглтон. – dunni

0

Насколько мне известно, @Bean является одиночным, да, и поэтому возвращение new ActionProducer(); в порядке. Это будет вызвано только весной после при запуске.

Если ActionProducer - это ваша собственная реализация, просто добавьте комментарий к классу с помощью @Component.

0

@Bean аннотаций позволяют определить Bean в контексте Spring приложения. По умолчанию Spring создает бобы как одиночные. Так что этот код будет производить синглтон в контексте Spring

@Bean 
public ActionProducer actionProducer() { 
    return new ActionProducer(); 
} 

Но вы должны получить доступ к компоненте через контекст приложения

applicationContext.getBean("myBeanName") 

Если вам нужен экземпляр вашего боба для каждого вызова, вам нужно определить область прототипа. Это то же самое, вам нужно получить доступ к нему через контекст приложения Spring.

@Bean(scope=DefaultScopes.PROTOTYPE) 
public ActionProducer actionProducer() { 
    return new ActionProducer(); 
} 

Вы можете увидеть здесь http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html

+0

Ваша ссылка указывает на устаревшую документацию старого проекта Spring Java Config.Я предлагаю обновить его до фактической документации Spring. –

Смежные вопросы