版权声明:本文为博主原创文章,遵循 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的使用:推荐使用构造函数进行注入相关推荐

  1. @Autowired的使用:推荐对构造函数进行注释

    最近在使用idea开发时经常看到右侧栏有黄色一堆堆的,好恶心,这些代表代码不符合规范,可能会出现问题,为了代码整洁和代码规范,则优化一把,重点记录下autowired注解优化. @autowired含 ...

  2. 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)...

    DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害.本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期.单利生命周 ...

  3. EntityFramework Core 3.x上下文构造函数可以注入实例呢?

    今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文 ...

  4. java 有参数的构造函数如何注入_Spring5参考指南:依赖注入

    依赖注入 依赖注入就是在Spring创建Bean的时候,去实例化该Bean构造函数所需的参数,或者通过Setter方法去设置该Bean的属性. Spring的依赖注入有两种基于构造函数的依赖注入和基于 ...

  5. Autowired,Qualifier,Spring 按名称注入bean属性

    Autowired,Qualifier,Spring 按名称注入bean属性 @Autowired@Qualifier("addItemDestination")private T ...

  6. pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:阿丙 www.cnblogs.com/acm-bingzi 在编写代码的时候,使用@ ...

  7. @autowired失败_@Autowired的使用:推荐对构造函数进行注释

    在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下: Spring Team recommends "Always use constructor based d ...

  8. 实例化bean中有@Autowired注解的有参构造函数(二)

    接着上一篇继续分析有参构造函数: 伪代码: @Autowiredpublic AutowiredConstructorBean(SC sc,CQ cq) {System.out.println(sc) ...

  9. 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)

    简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...

  10. java开发中推荐的防御sql注入方法_不推荐的防御sql注入方式

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. c++ boost库
  2. c#中将对象序列化为xml(包括list)
  3. 低照度监控前景广阔 企业展开激烈角逐
  4. TCP包头、UDP包头、IP包头、和MAC帧包头详细字段和包头大小
  5. 项目不能使用fn标签_无服务器,Java和FN项目的第一步
  6. spring心得6--自动装配知识点讲解及案例分析
  7. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统
  8. 《面向对象程序设计》课程作业(七)
  9. linux java运行class文件_jvm学习java文件运行过程
  10. Linux有问必答:如何查看Linux上程序或进程用到的库
  11. IDEA必备的10款插件
  12. PCB设计软件有哪些
  13. Linux 系统中如何恢复已删除的文件?
  14. python中cls和self的区别
  15. notepad++更换皮肤
  16. 自助订餐管理系统(小程序+后台源码+数据库)
  17. 程序员工作年限谜题:大数据为你解析,程序员到底能干到多少岁?
  18. c语言大作业成绩分析问题,河南科技大学c语言课程设计-综合排序设计报告-成绩分析问题.doc...
  19. 电脑PHP动画制作画板,html5教程制作简单画板代码分享
  20. 自定义View练习 - 汉字键盘

热门文章

  1. Android开发之桌面快捷键使用细则(原创)
  2. 一张图搞懂美国大数据产业(上)
  3. php 设置mssql编码 解决乱码问题 mssql_connect charset Utf8
  4. 【原创】MySql常见出错解决
  5. Linux ag命令
  6. leaks will report false positives while the environment variable NSZombiesEnable is active
  7. 使用 jQuery 避免鼠标双击
  8. Posix多线程编程学习笔记
  9. Linux内核通知链(Notifier)
  10. Linux系统下多版本gcc使用问题记录