@Autowired的使用:推荐对构造函数进行注释
最近在使用idea开发时经常看到右侧栏有黄色一堆堆的,好恶心,这些代表代码不符合规范,可能会出现问题,为了代码整洁和代码规范,则优化一把,重点记录下autowired注解优化。
@autowired含义
spring 2.5引入了@autowired注释,@autowired注释可以对类成员变量、方法、构造函数进行标注,完成自动装配功能。@autowired查找bean首先是先通过byType查,如果发现找到有很多bean,则按照byName方式对比获取,若有名称一样的则可以加上@Qualifier("XXX")配置使用。若非必须装配则可以设置required=false
用法
类成员变量
@Autowired
private PamaDataAdminProdInfoRecordService pamaDataAdminProdInfoRecordService;
方法
private Person person;
@Autowired
private void setPerson(Person person){this.person = person;
}
构造函数(推荐)
private final PamaAdminCompanyChannelMapService pamaAdminCompanyChannelMapService;
@Autowired
public PamaAdminCompanyChannelMapController(PamaAdminCompanyChannelMapService pamaAdminCompanyChannelMapService){this.pamaAdminCompanyChannelMapService = pamaAdminCompanyChannelMapService;
}
构造函数的写法大家是不是看着有点奇怪,其实事情是这样的,今天在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下:
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
大致翻译如下:
Spring建议”总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。
这段代码警告原来的写法是:
@Autowired
private PamaAdminCompanyChannelMapService pamaAdminCompanyChannelMapService;
建议后写成下面的样子:
private final PamaAdminCompanyChannelMapService pamaAdminCompanyChannelMapService;@Autowired
public PamaAdminCompanyChannelMapController(PamaAdminCompanyChannelMapService pamaAdminCompanyChannelMapService) {this.pamaAdminCompanyChannelMapService= pamaAdminCompanyChannelMapService;
}
我们知道:@Autowired 可以对成员变量、方法以及构造函数进行注释。用了好久成员变量突然看到这个开始怀疑人生了,那么对成员变量和构造函数进行注释又有什么区别呢?
@Autowired注入bean,相当于在配置文件中配置bean,并且使用setter注入。而对构造函数进行注释,就相当于是使用构造函数进行依赖注入了吧。莫非是这两种注入方法的不同。
以下是:@Autowired和构造方法执行的顺序解析
先看一段代码,下面的代码能运行成功吗?
@Autowired
private User user;
private String school;public UserAccountServiceImpl(){this.school = user.getSchool();
}
答案是不能。
因为Java类会先执行构造方法,然后再给注解了@Autowired 的user注入值,所以在执行构造方法的时候,就会报错。
报错信息可能会像下面:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...' defined in file [....class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException
报错信息说:创建Bean时出错,出错原因是实例化bean失败,因为bean时构造方法出错,在构造方法里抛出了空指针异常。
解决办法是,使用构造器注入,如下:
private User user;
private String school;@Autowired
public UserAccountServiceImpl(User user){this.user = user;this.school = user.getSchool();
}
可以看出,使用构造器注入的方法,可以明确成员变量的加载顺序。
PS:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired
那么最开始Spring建议,为何要将成员变量加上final类型呢?
网上有解释如下:spring配置默认的bean的scope是singleton,也就是启动后一直有。通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。
@Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,所以这个final是没有意义的吧。
可能是为了防止,在程序运行的时候,又执行了一遍构造函数;
或者是更容易让人理解的意思,加上final只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。
但是这种方式也有弊端当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数
可能会长到无法想像。
如果你使用的是field反射注入
如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean
规范。
还有,当你不是用过Spring
创建的对象时,还可能引起NullPointerException
。
并且,你不能用final
修饰这个属性。
如果你使用的是setter方法注入
那么你将不能将属性设置为final
。
Spring3.0官方文档建议使用setter注入覆盖构造器注入。
Spring4.0官方文档建议使用构造器注入。
我们已经看到,由于其许多缺点,无论看起来多么优雅,都应尽可能避免进行基于字段的注入。推荐的方法是使用基于构造函数和基于setter的依赖项注入。对于必需的依赖项,建议使用基于构造函数的注入,以使其不可变并防止它们为空。对于可选的依赖项,建议使用基于Setter的注入。
@Autowired的使用:推荐对构造函数进行注释相关推荐
- 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) ...
- 使用Spring2.5的Autowired实现注释型的IOC(转载)
专注java已6年,欢迎加入java核心技术QQ群:135138817,每周五晚有群主进行技术讲座. 使用Spring2.5的Autowired实现注释型的IOC 阅读(31) 评论(0) 发 ...
- @Autowired 与@Resource的区别(详细)
原文链接: https://blog.csdn.net/weixin_40423597/article/details/80643990 spring不但支持自己定义的@Autowired注解,还支持 ...
- @Autowired、@Qualifier、@Resource的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- autowired java配置_使用autowired注解怎么配置配置文件
展开全部 1. 使用Spring注解来注入属性e69da5e6ba9062616964757a686964616f31333363363434 1.1. 使用注解以前我们是怎样注入属性的 类的实现: ...
- 详细聊聊Javadoc注释规范
Javadoc 注释规范 1. 注释分类 2. Java文档和Javadoc 3. 文档注释的格式 3.1 文档和文档注释的格式化 3.2 文档注释的三部分 4. 使用Javadoc标记 4.1 ...
- Spring注解标签详解@Autowired @Qualifier等
@Autowired spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造函数进行标注,配合AutowiredAnnotationBeanProc ...
最新文章
- 根据当前时间查询上月26号的日期 本月月25号的日期
- poj 1092 Farmland (Geometry)
- 微调也重要:探究参数初始化、训练顺序和提前终止对结果的影响
- [PAT乙级]1006 换个格式输出整数
- 接口测试之HTTP协议详解
- 爬虫中如何获取页面编码类型
- 浅析低功耗广域网及在智慧城市中的应用
- mysql中in和exists的应用场景_mysql中关于in和exists的使用
- 二级菜单不同方法的实现
- lvm基本知识与常用命令
- HDU1425 sort【排序】
- css focus 选择器用于选取获得焦点的元素
- delphi 得到安装列表_印象笔记第2课 安装 基本操作 收集素材(视频+文字+图片)...
- Spring-IOC本质
- 68ES6_解构_数组操作_对象操作
- 读书感受 之 《写给年轻人的 经济学故事书》
- 详解谷歌VR平台Daydream:有手柄就是不一样
- win10便签常驻桌面_便签,草图,截屏草图,一个win10自带的小工具统统解决!...
- 【遗传算法GA】--计算函数最值(Python)
- 数字+字母+特殊字符 的正则表达式
热门文章
- lsattr命令和chattr命令
- java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数
- 基于大恒相机SDK,二次开发
- layui复选框怎么取值_layui获取多选框中的值方法
- 2015个人年终总结
- python怎么输出列表中元素的索引_python怎么获取列表元素的索引
- 手机上怎么记录恋爱天数?用便签记录情侣相恋天数
- html5按钮篮筐怎么去,我身高182cm,体重60kg.现以可以摸到篮板!却扣不了篮?跪求方法?要有用的!...
- 王者舰队服务器维护需要几天,王者舰队新手进阶玩法 新手怎么玩_3DM手游
- 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?