热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

可以通过多少种方式完成依赖注入,spring自动注入

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,这表示以后不能更改。


推荐阅读
author-avatar
heishi86188
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有