最近在使用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的使用:推荐对构造函数进行注释相关推荐

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

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

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

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

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

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

  4. 使用Spring2.5的Autowired实现注释型的IOC(转载)

    专注java已6年,欢迎加入java核心技术QQ群:135138817,每周五晚有群主进行技术讲座. 使用Spring2.5的Autowired实现注释型的IOC     阅读(31) 评论(0) 发 ...

  5. @Autowired 与@Resource的区别(详细)

    原文链接: https://blog.csdn.net/weixin_40423597/article/details/80643990 spring不但支持自己定义的@Autowired注解,还支持 ...

  6. @Autowired、@Qualifier、@Resource的区别

    参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...

  7. autowired java配置_使用autowired注解怎么配置配置文件

    展开全部 1. 使用Spring注解来注入属性e69da5e6ba9062616964757a686964616f31333363363434 1.1. 使用注解以前我们是怎样注入属性的 类的实现: ...

  8. 详细聊聊Javadoc注释规范

    Javadoc 注释规范 1. 注释分类 2. Java文档和Javadoc 3. 文档注释的格式  3.1 文档和文档注释的格式化 3.2 文档注释的三部分 4. 使用Javadoc标记  4.1 ...

  9. Spring注解标签详解@Autowired @Qualifier等

    @Autowired spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造函数进行标注,配合AutowiredAnnotationBeanProc ...

最新文章

  1. 根据当前时间查询上月26号的日期 本月月25号的日期
  2. poj 1092 Farmland (Geometry)
  3. 微调也重要:探究参数初始化、训练顺序和提前终止对结果的影响
  4. [PAT乙级]1006 换个格式输出整数
  5. 接口测试之HTTP协议详解
  6. 爬虫中如何获取页面编码类型
  7. 浅析低功耗广域网及在智慧城市中的应用
  8. mysql中in和exists的应用场景_mysql中关于in和exists的使用
  9. 二级菜单不同方法的实现
  10. lvm基本知识与常用命令
  11. HDU1425 sort【排序】
  12. css focus 选择器用于选取获得焦点的元素
  13. delphi 得到安装列表_印象笔记第2课 安装 基本操作 收集素材(视频+文字+图片)...
  14. Spring-IOC本质
  15. 68ES6_解构_数组操作_对象操作
  16. 读书感受 之 《写给年轻人的 经济学故事书》
  17. 详解谷歌VR平台Daydream:有手柄就是不一样
  18. win10便签常驻桌面_便签,草图,截屏草图,一个win10自带的小工具统统解决!...
  19. 【遗传算法GA】--计算函数最值(Python)
  20. 数字+字母+特殊字符 的正则表达式

热门文章

  1. lsattr命令和chattr命令
  2. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数
  3. 基于大恒相机SDK,二次开发
  4. layui复选框怎么取值_layui获取多选框中的值方法
  5. 2015个人年终总结
  6. python怎么输出列表中元素的索引_python怎么获取列表元素的索引
  7. 手机上怎么记录恋爱天数?用便签记录情侣相恋天数
  8. html5按钮篮筐怎么去,我身高182cm,体重60kg.现以可以摸到篮板!却扣不了篮?跪求方法?要有用的!...
  9. 王者舰队服务器维护需要几天,王者舰队新手进阶玩法 新手怎么玩_3DM手游
  10. 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?