在正常情况下,单例注入多例会导致多例失效
演示代码
E(默认为单例)
E内部注入了f1(f1为多例)
A09代码(通过getBean拿到E.class,间接的通过E获得f1,我们来看一下f打印结果):
将来我们的f1打印的结果,我们期望是多例,也就是打印结果会不同,结果如下:
结果f1是同一个,这样就出现了失效问题
解释
对于单例对象来讲,依赖注入仅发生了一次,后续再没有用到多例的 F,因此 E 用的始终是第一次依赖注入的 F
解决
- 仍然使用 @Lazy 生成代理(注入的是一个生成的代理,没有真正把f1注入进来,但是每次调用的时候都会由代理对象来创建一个新的f1)
- 代理对象虽然还是同一个,但当每次使用代理对象的任意方法时,由代理创建新的 f 对象
解决一
我们把注解加上
我们在打印一下结果查看:
可以发现打出来F1的结果一致,E的类型也是代理类型
还有其他方法可以解决此类问题:
这样配置后用E来注入也是没有问题的,两种解决办法原理一样,只是配置的方式不同。
解决二
我们不要注入F3,注入一个泛型为F3的对象工厂
F3
E中注入
然后我们去获得结果以及f3的类型查看
解决三
既然F4已经被@Component注入,那么我们就可以利用注入ApplicationContext,然后使用contex获取Bean即可解决
查看结果发现没有任何问题