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

热门文章

  1. python+wxauto实现微信助手
  2. 天刀服务器维护时间,10月20日服务器例行维护公告(已完成)
  3. 如何将照片同步到Apple Watch
  4. java oracle nvarchar2,Oracle中varchar、varchar2和nvarchar、nvarchar2
  5. usb鼠标制作调试记录
  6. 许多学习vba excel脚本的简单例子
  7. 用FLASH MX制作动画卡通人物(2)-矢量图形的转换与修改
  8. 熊市中预言机,牛市中的战斗机,藏宝计划起飞,坐稳扶好!
  9. Linux新建文件夹、删除文件命令
  10. 充电宝无线和有线哪个好?无线的充电宝好吗