首次使用带注释的Spring。我正在尝试定义一个单独的bean,如:
@Bean
public ActionProducer actionProducer() {
return new ActionProducer();
}
但我觉得这不是一个正确的方法,因为每次都返回一个“新”bean。我应该改为如下定义吗?
@Bean
public ActionProducer actionProducer() {
if (bean==null)
bean=new ActionProducer();
return bean
}
提前致谢。
答案 0 :(得分:1)
对于每个@Configuration
类,Spring将创建一个代理来控制对这些@Bean
方法的调用。因此,如果你有一个@Bean
方法,它应该创建一个单独的bean(默认情况下,如果你没有指定另一个范围),代理将确保该方法只被调用一次以创建豆。所有进一步的调用都被代理拦截,并且将返回已存在的bean
这样,你甚至可以调用那个bean方法,如果你在该类中有其他bean,它依赖于它,而不考虑范围,重复实例等。:
@Bean
public AnotherClass anotherClass() {
return new AnotherClass(actionProducer());
}
所以不要解决Spring功能,只需实现如下方法:
@Bean
public ActionProducer actionProducer() {
return new ActionProducer();
}
答案 1 :(得分:0)
据我所知,@Bean
是单身是的,因此返回new ActionProducer();
就好了。只有在启动时弹簧一次才能调用它。
如果ActionProducer
是您自己的实现,则只需使用@Component
注释该类。
答案 2 :(得分:0)
默认它被视为单例,就像在普通注释方式或xml方式中一样。如果您想要其他范围,则可以在方法上使用范围注释。
参考 https://www.quora.com/Is-any-method-annotated-with-Bean-treated-as-Singleton-by-Spring-Framework
答案 3 :(得分:0)
@Bean注释允许您将Bean定义到Spring应用程序上下文中。 默认情况下,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