了解 Spring4 注释 bean

Understanding Spring4 annotation beans

第一次使用 Spring 和注释。我正在尝试定义一个单例 bean,例如:

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

但我觉得这不是正确的做法,因为每次 returns 一个 "new" bean。我应该像下面这样定义吗?

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

提前致谢。

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

如果 ActionProducer 是您自己的实现,只需将 class 注释为 @Component

默认情况下,它被视为单例,就像在正常注释方式或xml方式中一样。如果你想要其他范围,那么你可以在方法上使用范围注释。

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

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

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

所以不要绕过 Spring 功能,只需按如下方式实现方法:

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

@Bean 注释允许您将 Bean 定义到 Spring 应用程序上下文中。 默认情况下 Spring 将 bean 创建为单例。所以这段代码将在 Spring context

中产生一个单例
@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