spring - 用NEW创建的spring bean真的是单例吗

标签 spring spring-bean spring-ioc

我在这样的配置类中创建了一个spring bean:

@Bean
MyClass getMyClass() {
    MyClass mc = new MyClass()
    return mc;
}

每当MyClass在另一个需要注入(inject)的类中 Autowiring ,它是否总是会根据 new 创建一个新对象?在bean定义中?
以这种方式创建的 bean 是真正的单例吗?

最佳答案

Spring保证您在使用 Bean 注释的方法中所做的任何事情注释它只会做一次。内部 Spring 工厂会处理这个问题。

当然,这取决于 scope但默认范围是 singleton .请参阅文档:

  • Scopes
  • Bean
  • Is spring default scope singleton or not?

  • 小例子应该可以帮助您了解它是如何工作的:
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.time.LocalDateTime;
    import java.util.Random;
    
    @Configuration
    public class SpringApp {
    
        public static void main(String[] args) {
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringApp.class);
    
            System.out.println(ctx.getBean(MyClass.class));
            System.out.println(ctx.getBean(MyClass.class));
            System.out.println(ctx.getBean(MyClass.class));
            System.out.println(ctx.getBean(MyClass.class));
        }
    
        @Bean
        public MyClass getMyClass() {
            System.out.println("Create instance of MyClass at " + LocalDateTime.now());
            MyClass myClass = new MyClass();
    
            return myClass;
        }
    }
    
    class MyClass {
    
        private int value = new Random().nextInt();
    
        @Override
        public String toString() {
            return super.toString() + " with values = " + value;
        }
    }
    

    打印:
    Create instance of MyClass at 2019-01-09T22:54:37.025
    com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
    com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
    com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
    com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
    

    当您定义具有范围 protoype 的 bean 时
    @Scope("prototype")
    @Bean
    public MyClass getMyClass()
    

    应用程序打印:
    Create instance of MyClass at 2019-01-09T22:57:12.585
    com.celoxity.spring.MyClass@282003e1 with values = -677868705
    Create instance of MyClass at 2019-01-09T22:57:12.587
    com.celoxity.spring.MyClass@7fad8c79 with values = 18948996
    Create instance of MyClass at 2019-01-09T22:57:12.587
    com.celoxity.spring.MyClass@71a794e5 with values = 358780038
    Create instance of MyClass at 2019-01-09T22:57:12.587
    com.celoxity.spring.MyClass@76329302 with values = 868257220
    

    关于spring - 用NEW创建的spring bean真的是单例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118541/

    相关文章:

    java - 在java中的bean中插入${xxx}的值

    java - Spring DI 在运行时而不是编译时解决依赖的优点在基于 Java 的配置中丢失了吗?

    java - 如何使用 Spring 进行参数化依赖注入(inject)?

    java - 有没有办法让@Bean 创建的一些 bean 可区分?

    java - 我可以通过按键为@Cacheable 设置TTL 吗?

    spring - Spring HTTP 调用程序的 TLS/SSL 配置

    java - Spring 预填表格不起作用

    unit-testing - 如何覆盖 Spring @Autowired 的行为

    spring - 不能很好地理解spring-mvc的 `@Autowired HttpServletRequest`

    java - Spring 类必须是 AutoWire 属性的组件吗?