【问题标题】:What is the difference between bean with scope prototype and new Object in singleton bean?具有范围原型的bean和单例bean中的新对象有什么区别?
【发布时间】:2019-04-19 08:39:47
【问题描述】:

喜欢主题。我没有看到这些方法之间有任何区别。 当我只使用这些时,原型 bean 很清楚。但是在春季,我们基于单例的 bean,所以当我在单例 bean 中使用具有范围原型的 bean 时,它看起来就像我想创建新对象一样。

    @Service
    public class SomeService{
        @Autowired
        private ApplicationContext applicationContext;

    public void someClass() {
       PrototypeObject prototypeObject = applicationContext.getBean(PrototypeObject .class);
       PrototypeObject prototypeObject = new PrototypeObject();
    }
   }

这两种方法有区别吗?


对我来说最好的答案是: 我失去了 IoC 的所有优势。

【问题讨论】:

  • 不同之处在于,当您手动创建一个对象时,您将失去其上的所有 IoC 功能(即必须手动注入依赖项、配置值、调用侦听器、执行事务标记等 - 容器自动执行的所有操作豆类)

标签: java spring


【解决方案1】:

它们完全不同。

Spring Managed Beans :每当您使用 @Bean 创建 bean 或调用任何 bean 时 @Inject/@Autowired 它们在 Spring 上下文中,它们可以执行 Spring 相关的功能,或者从应用程序上下文中获取它(虽然不推荐,因为它反对控制反转)。

非 Spring Managed Beans:每当您使用 new 创建 bean 时,它们都会从 Spring 上下文中移出,并且不能再在 Spring Managed Context 中使用。

用 new 创建的对象不知道任何 Spring 注释和相关功能。

【讨论】:

  • 不知道任何 Spring 注释 - 不仅是注释,还有特殊接口等等
【解决方案2】:

让我们从每个人都知道的“Singleton”开始

spring默认所有bean都是单例的,这意味着只有一个副本存在多个引用

第二个有趣的“原型”

每次从容器请求原型作用域时都会返回一个差异实例,因此在春季,如果您每次都将任何 bean 作为原型,您将获得具有该 bean 的自动装配属性的不同实例

第三个是“新”关键字

这将返回新对象、具有默认值或 null 的属性,这也是未在 spring 应用程序上下文中注册的对象

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多