Spring中频繁使用的依赖注入方式,官方不推荐,我们一直在误用?

1,554 阅读2分钟

你的Spring项目中使用的是哪种注入方式? (单选)

A.基于字段的依赖注入

B.基于构造函数的依赖注入

C.基于 setter 的依赖注入

使用 idea 做 Java 开发的小伙伴,应该会遇到这个提示:Field injection is not recommended。有强迫症的小伙伴可以试下 Resource 注解。

1、 基于构造函数的依赖注入

基于构造函数注入的主要优点是可以将需要注入的字段声明为 final

注意:当 Bean A 依赖 B,Bean B 依赖 A 这种情况下出现循环依赖。
Bean A → Bean B → Bean A

解决循环依赖的方法:

① 重新设计,消除循环依赖;

② 使用注解 @Lazy,在注入依赖时,先注入代理对象,当首次使用时再创建对象完成注入。

③ 使用 Setter/Field 注入

2、基于 Setter 的依赖注入

3、基于字段的依赖注入

属性注入的主要优点:代码简洁

4、为什么不推荐基于字段依赖注入?

Spring 团队提倡使用基于构造方法的注入,因为这样一方面可以将依赖注入到一个不可变的变量中 (注:final 修饰的变量),另一方面也可以保证这些变量的值不会是 null。此外,经过构造方法完成依赖注入的组件 (注:比如各个 service),在被调用时可以保证它们都完全准备好了。与此同时,从代码质量的角度来看,一个巨大的构造方法通常代表着出现了代码异味,这个类可能承担了过多的责任。

5、@Autowire 和 @Resource 注解的区别

① @Autowired 与 @Resource 都可以用来装配 bean. 都可以写在字段上,或写在 setter 方法上。

② @Autowired 默认按类型装配(这个注解是属业 spring 的),默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false,如:
@Autowired (required=false) ,如果我们想使用名称装配可以结合 @Qualifier 注解进行使用。

③ @Autowired 是先通过 byType 注入,其次才是 byName, 而 @Resource 则是先 byName, 其次才是 byType

欢迎关注我,如果你有更好的想法,欢迎留言,一起探讨,想说你就说啊!

需要最新java资料和小手册的小伙伴可以微我免费获取资料哦