了解Spring4注释bean

时间:2015-12-10 14:50:19

标签: java spring annotations spring-bean

首次使用带注释的Spring。我正在尝试定义一个单独的bean,如:

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

但我觉得这不是一个正确的方法,因为每次都返回一个“新”bean。我应该改为如下定义吗?

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

提前致谢。

4 个答案:

答案 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