繁体   English   中英

了解Spring4注释bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM