关于@Autowired的使用:推荐使用构造函数进行注入
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/uaucome/article/details/85259654
近期看同事用idea开发的代码,发现在使用@Autowired的时候,大多使用构造函数进行注入。
以前自己在写代码的时候都是直接在变量上进行注入,也没注意过,查了些资料,发现如果直接在变量上进行注入,那么可能会造成NPE。
构造函数注入的方式:
public class TestController {
private final TestService testService;
@Autowired
public TestController(TestService testService) {
this.testService = testService;
}
…
}
变量注入的方式:
public class TestController {
@Autowired
private TestService testService;
…
}
那么为什么变量注入的方式可能会造成NPE?如下:
public class TestController {
@Autowired
private TestService testService;
private String testname;
public TestController(){
this.testname = testService.getTestName();
}
}
这段代码执行时会报NPE。
该类的构造函数中的变量值是通过TestService实例来调用TestService类中的方法获得,而Java类会先执行构造函数,然后在通过@Autowired注入实例,因此在执行构造函数的时候就会报错。
解决方案就是采用构造函数的注入方式,如下:
public class TestController {
private TestService testService;
private String testname;
@Autowired
public TestController(TestService testService){
this.testService = testService;
this.testname = testService.getTestName();
}
}
上面的方法中没有加入final来修饰,但是spring官方文档上是建议将成员变量加上final类型的,这是为什么呢?
有网友解释:
1.spring配置默认的bean的scope是singleton,可以通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。
2.@Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,所以这个final是没有意义的吧。
无论是spring的bean的scope是单例还是多例,成员变量加上了final后,只能被赋值一次,赋值后值不再改变。
注意:
1.如果使用变量注入的话,可能回导致循环依赖,即A里面注入B,B里面又注入A。
2.在代码中发现构造方法中注入了很多依赖,显得很臃肿,对于这个问题,说明类中有太多的责任,违反了类的单一性职责原则,这时候需要考虑使用单一职责原则进行代码重构。
参考资料:https://blog.csdn.net/qq_28587263/article/details/75570745
————————————————
版权声明:本文为CSDN博主「uaucome」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/uaucome/article/details/85259654
关于@Autowired的使用:推荐使用构造函数进行注入相关推荐
- @Autowired的使用:推荐对构造函数进行注释
最近在使用idea开发时经常看到右侧栏有黄色一堆堆的,好恶心,这些代表代码不符合规范,可能会出现问题,为了代码整洁和代码规范,则优化一把,重点记录下autowired注解优化. @autowired含 ...
- 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)...
DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害.本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期.单利生命周 ...
- EntityFramework Core 3.x上下文构造函数可以注入实例呢?
今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文 ...
- java 有参数的构造函数如何注入_Spring5参考指南:依赖注入
依赖注入 依赖注入就是在Spring创建Bean的时候,去实例化该Bean构造函数所需的参数,或者通过Setter方法去设置该Bean的属性. Spring的依赖注入有两种基于构造函数的依赖注入和基于 ...
- Autowired,Qualifier,Spring 按名称注入bean属性
Autowired,Qualifier,Spring 按名称注入bean属性 @Autowired@Qualifier("addItemDestination")private T ...
- pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:阿丙 www.cnblogs.com/acm-bingzi 在编写代码的时候,使用@ ...
- @autowired失败_@Autowired的使用:推荐对构造函数进行注释
在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下: Spring Team recommends "Always use constructor based d ...
- 实例化bean中有@Autowired注解的有参构造函数(二)
接着上一篇继续分析有参构造函数: 伪代码: @Autowiredpublic AutowiredConstructorBean(SC sc,CQ cq) {System.out.println(sc) ...
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)
简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...
- java开发中推荐的防御sql注入方法_不推荐的防御sql注入方式
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
最新文章
- c++ boost库
- c#中将对象序列化为xml(包括list)
- 低照度监控前景广阔 企业展开激烈角逐
- TCP包头、UDP包头、IP包头、和MAC帧包头详细字段和包头大小
- 项目不能使用fn标签_无服务器,Java和FN项目的第一步
- spring心得6--自动装配知识点讲解及案例分析
- 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统
- 《面向对象程序设计》课程作业(七)
- linux java运行class文件_jvm学习java文件运行过程
- Linux有问必答:如何查看Linux上程序或进程用到的库
- IDEA必备的10款插件
- PCB设计软件有哪些
- Linux 系统中如何恢复已删除的文件?
- python中cls和self的区别
- notepad++更换皮肤
- 自助订餐管理系统(小程序+后台源码+数据库)
- 程序员工作年限谜题:大数据为你解析,程序员到底能干到多少岁?
- c语言大作业成绩分析问题,河南科技大学c语言课程设计-综合排序设计报告-成绩分析问题.doc...
- 电脑PHP动画制作画板,html5教程制作简单画板代码分享
- 自定义View练习 - 汉字键盘
热门文章
- Android开发之桌面快捷键使用细则(原创)
- 一张图搞懂美国大数据产业(上)
- php 设置mssql编码 解决乱码问题 mssql_connect charset Utf8
- 【原创】MySql常见出错解决
- Linux ag命令
- leaks will report false positives while the environment variable NSZombiesEnable is active
- 使用 jQuery 避免鼠标双击
- Posix多线程编程学习笔记
- Linux内核通知链(Notifier)
- Linux系统下多版本gcc使用问题记录