介绍
对原型的期望:每次都是新的,保证唯一性
对单例的期望:每次都是同一个,保证复用性
当单例依赖原型时,因为单例已经在初始化时完成了注入,但是只要容器不销毁,被注入的原型也不会销毁
而这不符合对单例的期望,这个时候就需要使用代理作用域
猜的:在从容器中拿去单例时,使用动态代理(Spring中有,只需要进行标识)进行注入
解决方法
@Scope 中在 proxyMode 属性添加 ScopedProxyMode.TARGET_CLASS
@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
注意:当一个单例的Bean注入一个原型Bean的时候,原型会失效,
因为在容器在初始化单例的Bean时为了正确注入实例,会将需要注入的对象预先创建出来并注入到当前的单例Bean中,因此只要单例的Bean不销毁,被注入的这个对象也一并存在当一个单例的Bean注入原型Bean的时候,如果想让原型生效,那么可以设置proxyMode属性,这个属性就是代理作用域,
其原理是当初始化单例Bean的时候,并不会立即完成注入,而是将一个代理对象(暂时可理解为替身)设置到单例中,
当调用注入对象的方法时,此时替身会自动从原型容器中创建一个实例并返回,保证原型的有效