[英]Understanding Spring4 annotation beans
第一次使用带有注释的Spring。 我试图像这样定义一个单例豆:
@Bean
public ActionProducer actionProducer() {
return new ActionProducer();
}
但是我觉得这不是正确的方法,因为每次都会返回一个“新” bean。 我应该改为定义如下吗?
@Bean
public ActionProducer actionProducer() {
if (bean==null)
bean=new ActionProducer();
return bean
}
提前致谢。
对于每个@Configuration
类,Spring将创建一个代理来控制对这些@Bean
方法的调用。 因此,如果您有一个@Bean
方法,该方法应该创建一个单例bean(如果未指定其他作用域,则默认情况下会这样做),代理将确保该方法仅被调用一次才能创建bean。 代理将拦截所有进一步的调用,并将返回已经存在的bean。
这样,如果您在该类中有其他依赖于它的bean,而无需考虑范围,重复实例等,甚至可以调用该bean方法:
@Bean
public AnotherClass anotherClass() {
return new AnotherClass(actionProducer());
}
因此,不要绕过Spring功能,而只能实现以下方法:
@Bean
public ActionProducer actionProducer() {
return new ActionProducer();
}
据我所知, @Bean
是单身,是的,因此返回new ActionProducer();
很好 它只会在启动时由Spring调用一次 。
如果ActionProducer
是您自己的实现,则只需使用@Component
注释类。
默认情况下,将其视为单例,就像普通的注释方式或xml方式一样。 如果需要其他作用域,则可以在方法上使用作用域注释。
参考https://www.quora.com/Is-any-method-annotated-with-Bean-processor-as-Singleton-by-Spring-Framework
@Bean注释使您可以在Spring应用程序上下文中定义Bean。 默认情况下,Spring将bean创建为单例。 所以这段代码将在Spring上下文中产生一个单例
@Bean
public ActionProducer actionProducer() {
return new ActionProducer();
}
但是您需要通过Application上下文访问bean
applicationContext.getBean("myBeanName")
如果每次调用都需要一个bean实例,则需要定义Prototype范围。 一样,您需要通过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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.