了解Spring4注释bean



第一次使用带有注释的Spring。我正在尝试定义一个类似于的单例bean

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

但我觉得这不是一个正确的方法,因为每次都会返回一个"新"bean。我应该像下面这样定义吗?

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

提前谢谢。

对于每个@Configuration类,Spring将创建一个代理,用于控制对这些@Bean方法的调用。因此,如果您有一个@Bean方法,它应该创建一个singleton bean(默认情况下,如果您没有指定另一个作用域,它会这样做),代理将确保该方法只被调用一次来创建bean。所有进一步的调用都被代理拦截,并且已经存在的bean将被返回
这样,如果该类中有其他依赖于它的bean,您甚至可以直接调用该bean方法,而不必考虑范围、重复实例等:

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

因此,不要围绕Spring功能工作,只需实现以下方法:

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

据我所知,@Bean是singleton yes,因此返回new ActionProducer();就可以了。它只会在启动时被spring调用一次

如果ActionProducer是您自己的实现,只需使用@Component对类进行注释即可。

默认情况下,它被视为singleton,就像普通的注释方式或xml方式一样。如果需要其他作用域,则可以在方法上使用作用域注释。

参考https://www.quora.com/Is-any-method-annotated-with-Bean-treated-as-Singleton-by-Spring-Framework

@Bean注释允许您在Spring应用程序上下文中定义Bean。默认情况下,Spring将bean创建为singleton。因此,这段代码将在Spring上下文中生成一个单例

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

但是您需要通过应用程序上下文访问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

最新更新