Java Spring框架中bean作用域的原型实现

Java Spring框架中bean作用域的原型实现,java,spring,Java,Spring,大家好,我正试图了解在春季国际奥委会中原型范围是如何工作的 对于我试图理解的原型bean: 1.一遍又一遍地读这篇文章,但无法完全理解() 2.试图通过源代码进行调试,只了解一件事:如果我们不指定proxyMode,它将不会为原型bean创建代理。 3.原型范围的默认ScopedProxyMode为默认值,通常等于NO。。除非在组件扫描中配置 我这里有三个例子: 案例A:在未定义proxymode的情况下独立使用的原型bean(不具有任何依赖项或不是任何bean的依赖项) 案例B:单例bean中

大家好,我正试图了解在春季国际奥委会中原型范围是如何工作的

对于我试图理解的原型bean:
1.一遍又一遍地读这篇文章,但无法完全理解() 2.试图通过源代码进行调试,只了解一件事:如果我们不指定proxyMode,它将不会为原型bean创建代理。
3.原型范围的默认
ScopedProxyMode
为默认值,通常等于NO。。除非在组件扫描中配置

我这里有三个例子: 案例A:在未定义proxymode的情况下独立使用的原型bean(不具有任何依赖项或不是任何bean的依赖项) 案例B:单例bean中的原型bean作为未定义proxymode的依赖项 案例C:单例bean中的原型bean作为proxymode定义的依赖关系 这里的问题是:
  • 案例A、案例B和案例C将如何工作
  • 我正在努力理解什么才是正确的方法
  • 另外,未指定proxymode是否正确
  • 未设置proxyMode时会发生什么情况?那么原型是如何工作的呢
  • 我通常在internet上的实现示例中看到的是,人们通常不会错误地配置proxyMode,或者不知道这个选项,或者他们可能是对的

    感谢您的宝贵时间。

    • A、 B和C都将在请求时返回Employee的新实例
    • A和B是使用原型作用域的常用方法
    • 不指定是通常的方式。虽然在某些情况下,作用域是RequestScope或sessionscope等,但指定proxyMode可能是有意义的。关于指定代理模式,请参见最后一段
    • 如果未设置,则获得预期的行为。也就是说,每次请求bean实例时都会得到新实例
    prototype作用域指示Spring在应用程序每次请求bean实例时都实例化一个新的bean实例

    您应该考虑在下面的场景中使用原型范围:

    • 如果您有一个具有大量可写状态的bean,那么您可能会发现同步的成本大于创建一个新实例来处理来自依赖对象的每个请求的成本
    • 一些依赖对象需要一个具有私有状态的bean,以便它们可以与依赖该bean的其他对象分开进行处理。在这种情况下,单身显然是不合适的。考虑原型。<李>
    bean应该实现some接口,这是一个很好的实践。在这种情况下,Spring使用JDK代理机制来创建类的代理。但实现接口并不是一项要求。如果您的bean没有实现任何接口,那么Spring将使用CGLIB库来创建bean的代理(除非用@Configuration注释一个类,在这种情况下使用不同的代理机制)

    通过指定
    proxyMode=ScopedProxyMode.TARGET\u CLASS
    ,您就强制Spring使用CGLIB代理机制。最后,仅仅提供
    @Scope(“prototype”)
    就足够了

    另一方面,要知道,如果有任何方法钩住bean的生命周期(比如
    @PreDestroy
    ,实现
    DisposableBean
    接口,或者
    destromethod
    作为
    @bean
    中的标志),那么这些方法将永远不会在原型范围的bean中调用

    @Bean
    @Scope("prototype")
    public Employee employee(){
      return new Employee();
    }
    
    @Bean
    @Scope("prototype")
    public Employee employee(){
      return new Employee();
    }
    
    @Bean
    @Scope("singleton")
    public Department department(){
      return new Department();
    }
    
    @Bean
    @Scope("prototype",proxyMode= ScopedProxyMode.TARGET_CLASS)
    public Employee employee(){
      return new Employee();
    }
    
    @Bean
    @Scope("singleton")
    public Department department(){
      return new Department();
    }