Lombok版的构造器注入方式

做开发的同学可能都会发现, idea 在我们经常使用的@autowired注解上添加了警告: field injection is not recommended, 即: 不推荐使用属性注入。那怎么解决这个问题呢?
问题原因违背单一职责原则因为现在的业务一般都会使用很多依赖, 但拥有太多的依赖通常意味着承担更多的责任,而这显然违背了单一职责原则。
依赖spring@autowired由 spring 提供,而@resource是jsr-250提供的,它是java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他ioc框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。
其他我看到网络上有一些其他方面的总结,比如:因为是 bytype 注入, 因此有可能会出现两个相同的类型bean,进而导致spring装配失败;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。
对于@autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。能够有效提高代码简洁性,让依赖注入的事情交给ioc容器,省时省力,这也是它的优点,我们应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。
其他注入方法除了使用@autowired以外,我们其实也有几种好用的方式。使用@resource替代@autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。
setter注入能够通过懒加载的方式解决循环依赖,类中的依赖在需要用到的时候才会注入。另外,setter注入方式很灵活,注入的对象还能改变。
@restcontrollerpublic class democontroller { private demoservice demoservice; /* * 基于set注入 * */ @autowired public void setdemoservice(demoservice demoservice) { this.demoservice = demoservice; }}这种方法也使用了@autowired注解,但是它是作用于成员变量的setter函数上,而不是像field注入一样作用于成员变量上。
这是三种注入方式中最灵活的,这个灵活就是它的缺点。setter注入的依赖不能保证依赖不可变。
构造器@restcontrollerpublic class democontroller { private demoservice demoservice; /* * 基于构造方法的注入 * */ public democontroller(demoservice demoservice) { this.demoservice = demoservice; }}它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。
但其也有缺点,假如类中需要注入的依赖比较多,就会显得构造方法很臃肿,缺乏可读性。另外,构造器注入不能解决循环依赖问题。
构造器简化版(推荐)首先,需要引入lombok依赖。
org.projectlombok lombok随后,我们在创建时就可以使用@requiredargsconstructor注解,它将帮我们创建构造器,注意,属性必须添加 final 关键字。
@restcontroller@requiredargsconstructorpublic class democontroller { /* * 用@requiredargsconstructor注解,这个使用方式也可以应用于service层 * */ private final demoservice demoservice;}通过查看编译结果,发现lombok自动生成了构造方法,非常简便。
总结最不推荐使用的是 属性注入 ,除了省力以外没有好处。
setter注入 和 构造器注入 各有优劣,需要根据实际情况选择。
最推荐使用 lombok版的构造器注入 方式,既简单又可靠。

IC Insights:预计4Q2018全球IC市场同比增长率仅为6%
“云端”研发的机器人,为防疫工作带来很大帮助
盘点华为2018年手机结构件相关供应商
魏德米勒推出模拟信号调整器,可对电流电压信号进行转换
利用100W的智能功率模块来提升功能集成度、能效和灵活性
Lombok版的构造器注入方式
LLC的谐振电感和其他拓扑的电感的差别 LLC调试中需要注意的问题
造就高智商机器人核心条件视觉语言导航
封装技术逐渐成熟,芯片技术将步入Chiplets时代
Linux技术:什么是cpu上下文切换
第十届IOTE 2018夏季展,八大热点应用技术
语音识别与物联网自动化导论
H系列十代酷睿对比锐龙4000H的差距分析
数字信号和模拟信号到底有什么区别
到底什么是算力?算力的作用?
爱立信携手合作伙伴以5G技术全方位应对灾害
NTC的特性与选型介绍
中国有可能借助数字化,完成一次文化生成和文化输出
央视记者专访三星副社长:Note7为何不对中国启动召回?
5G的高速发展需要诸多重要因素的支撑