作者:heishi86188 | 来源:互联网 | 2023-09-18 13:41
spring依赖注入的三种方式以及优缺点一.依赖注入的三种方式1.通过构造器注入。2.通过setter注入。3.在成员变量上写上注解来注入,这种方式,精短,可读性高,不需要多余的
spring有三种依赖注入的方式和优缺点1 .依赖注入的三种方式1 .通过生成器注入。 (spring4.3及更高版本,建议使用)
用setter注入。 (建议使用spring4.3之前的版本)
用filed注入。
2 .三种方式的代码示例: Constructor注入privatealarmcontactservicealarmcontactservice; 私有信息服务; 私有文件服务服务; @ autowiredpublicalarmcontactcontroller (alarmcontactservicealarmcontactservice,AlarmService alarmService,sysuserservicesyser this.sysuserservice=sysuserservice; } Setter注入privatealarmcontactservicealarmcontactservice; 私有服务服务; 私有服务服务; @ autowiredpublicvoidsetalarmcontactservice (alarmcontactservice (this.alarmcOntactservice=alarmcontactservice ) @ autowiredpublicvoidsetalarmservice (alarm service ) { this.alarm service=alarm service; } @ autowiredpublicvoidsetsysuserservice (sysuserservice ) this.sysuserservice=sysuserservice; } Field注入@ autowiredprivatealarmcontactservicealarmcontactservice; @ autowiredprivatealarmservicealarmservice; @ autowiredprivatesysuserservicesysuserservice; 3.3基于三种方案的优缺点三种方式的优点分析1 .生成器注入,依赖于注入的顺序是固定的,不允许在我们创建的bean对象之间存在循环依赖关系。 这样,Spring就可以解决循环依赖的问题。
基于setter注入,仅在需要注入对象时注入依赖项,而不是在初始化时注入。
3 .为成员变量编写注释并注入的方式,简短、可读性强,不需要多余的代码,维护也很容易。
使用三种方式的缺点分析1 .生成器注入的缺点是,如果我们的生成器需要注入的对象很多,就会显得像我们的生成器,冗长,不美观,可读性差,也不容易维护。
选择setter方法进行注入时,对象不能为final;
在field变量中实现注入时
a .这样不符合JavaBean的规格,很可能会引起空指针
b .无法同时将对象标记为final
c .类与DI容器高度结合,不能在外部使用;
d .类不能通过反射实例化。 例如,在单元测试中,需要使用DI容器实例化。 这就像一个集成测试
来自Spring官方文档的建议:
在Spring 3.x中,Spring团队建议使用setter进行注入。 在Spring 4.x中,Spring团队不再建议使用setter注入,而改为constructor。
Spring团队通常建议使用构造器来注入将APP应用程序组件实现为不可变对象,以确保所需的依赖关系不是空的。 此外,生成器注入组件始终返回处于完全初始化状态的客户端(调用)。 注意:大量的构造函数参数是不良的代码习惯,看起来也很糟糕。 这意味着类可能有太多的责任,需要重构以更好地解决相应的关注点分离。
3 .说明什么是循环依赖:1. 循环依赖是什么?
如果Bean A依赖于b,而Bean B依赖于a,则会发生循环依赖。
豆a豆b豆a或豆a豆b豆c豆a
2. 循环依赖会产生什么结果?
在Spring加载所有Bean时,Spring将尝试按照可以成功创建Bean的顺序创建Bean。
例如,有以下依存:
Bean A Bean B Bean C
Spring首先创建beanC,然后创建bean B,然后将c注入b,最后创建bean A,然后将b注入a。
如果有以下循环依赖的话:
豆a豆b豆c豆d豆a
但是,如果存在循环依赖,Spring将无法确定首先创建哪个bean。 在这种情况下,Spring将生成异常的beancurrentlyincreationexception。
一条Spring 4.3 的新特征:
从Spring 4.3开始,如果类只有一个构造函数,Spring将实现隐式自动注入。
删除并测试生成器的@Autowired注释后,发现该程序可以正常运行。 对alarmContactService、alarmService和sysUserService的依赖也成功了。
私有角色服务服务; 私有信息服务; 私有文件服务服务; publicalarmcontactcontroller (alarmcontactservicealarmcontactservice,AlarmService alarmService,系统服务警报服务)、系统服务系统服务this.sysuserservice=sysuserservice; }使用结构注入允许加入final,这表示以后不能更改。