@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 ...
最新文章
- 单片机干嘛的?嵌入式是单片机吗?
- mysql 把表的值用来计算_mysql一张表到底能存多少数据?
- 苹果6屏幕多大_苹果12使用高通X55,10亿买下的英特尔基带何时能派上用场
- 【经验分享】产品、运营人如何告别重复的数据分析工作?
- python字符串的方法和列表的方法_Python学习笔记字符串操作之join()和split()方法,列表转字符串,字符串转列表...
- windbg调试HEAP
- 调查了 2 万多名 Python 开发者,有了这些发现!
- SINet: 使用空间压缩模块和信息遮挡编码器的极轻量人像分割模型
- Activity中的setDefaultKeyMode() (转载)
- c51计数器代码汇编语言,51单片机6位计数器汇编程序
- 台式计算机用什么网卡,台式机没有网卡怎么办
- 缓解眼睛疲劳的一些解决方案
- 讯飞离线语音合成(语记|语音+)
- 论文翻译:2021_MetricGAN+: An Improved Version of MetricGAN for Speech Enhancement
- Vue-----table 控件自动勾选全选框2 与tab控件组合使用
- 高德地图教程_poi搜索以及显示
- 汇编语言:使用汇编程序计算2的8次方
- 马克思主义哲学(哲学概论)
- UGUI源码分析:开关组件Toggle与ToggleGroup
- 想减肥就要管住嘴,怎么管?这个方法可以