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

  在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下:

  Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

  翻译:
    Spring建议”总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。

这段代码警告原来的写法是:

@Autowired
private EnterpriseDbService service;

建议后写成下面的样子:

private final EnterpriseDbService service;

@Autowired
public EnterpriseDbController(EnterpriseDbService service) {
   this.service = service;
}

  奇怪,为何会有这样的建议。

  我们知道:@Autowired 可以对成员变量、方法以及构造函数进行注释。那么对成员变量和构造函数进行注释又有什么区别呢?

  @Autowired注入bean,相当于在配置文件中配置bean,并且使用setter注入。而对构造函数进行注释,就相当于是使用构造函数进行依赖注入了吧。莫非是这两种注入方法的不同。



  以下是:@Autowired和构造方法执行的顺序解析

  先看一段代码,下面的代码能运行成功吗?

1 @Autowired
2 private User user;
3 private String school;
4
5 public UserAccountServiceImpl(){
6     this.school = user.getSchool();
7 }

  答案是不能。

  因为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时构造方法出错,在构造方法里抛出了空指针异常。

  解决办法是,使用构造器注入,如下:

1 private User user;
2 private String school;
3
4 @Autowired
5 public UserAccountServiceImpl(User user){
6     this.user = user;
7     this.school = user.getSchool();
8 }

  可以看出,使用构造器注入的方法,可以明确成员变量的加载顺序

  PS:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

  参考:http://blog.csdn.net/ruangong1203/article/details/50992147



  那么最开始Spring建议,为何要将成员变量加上final类型呢?

  网上有解释如下:spring配置默认的bean的scope是singleton,也就是启动后一直有。通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。

  @Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,所以这个final是没有意义的吧。

  可能是为了防止,在程序运行的时候,又执行了一遍构造函数;

  或者可能是更容易让人理解的意思吧,加上final只会在程序启动的时候初始化一次。

  不过这种写法,我还是蛮喜欢的!

  原创文章,欢迎转载,转载请注明出处!

时间: 2024-10-12 07:25:45

@Autowired的使用:推荐对构造函数进行注释的相关文章

C#中的XML文档注释-推荐的文档注释标记

文档注释是为了方便自己和他人更好地理解代码所实现的功能.下面记录了一些常用的文档注释标记: <C> 用法: <c>text</c> 将说明中的文本标记为代码.例如: /// <summary> /// Validates the user. /// </summary> /// <param name="username">The username.</param> /// <param name

@Autowired @Resource @Qualifier的区别

参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/details/49203619 http://blog.csdn.net/ad921012/article/details/49679745 spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@

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

参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/details/49203619 http://blog.csdn.net/ad921012/article/details/49679745 spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@

使用 Spring 2.5 注释驱动的 IoC 功能(转)

基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置 Bean.装配 Bean 的功能,您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置.本文通过实例详细讲述了 Spring 2.5 基于注释 IoC 功能的使用. 陈 雄华 ([email protected]), 技术总监, 宝宝淘网络科技有限公司 2008 年 2 月 28 日 内容 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 J

详细聊聊Javadoc注释规范

Javadoc 注释规范 1. 注释分类 2. Java文档和Javadoc 3. 文档注释的格式 3.1 文档和文档注释的格式化 3.2 文档注释的三部分 4. 使用Javadoc标记 4.1 @see 的使用 4.2 @author.@version 说明类 4.3 @param.@return 和 @exception 的使用 5. Javadoc命令 6. 注释范例 1.注释分类 对于Java注释共有三种分类: 1. // 注释单行 2. /* - */ 注释若干行 3. /* - /

Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier、@scope

以下内容摘自部分网友的,并加上了自己的理解 @Service用于标注业务层组件(我们通常定义的service层就用这个) @Controller用于标注控制层组件(如struts中的action.Spring MVC中的Controller) @Repository用于标注数据访问组件,即DAO组件 @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注. 这几个注解是当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

Java基础——注释规范

一.注释格式分类: 1.单行(single-line)注释://-- 2.块(block)注释:/*--*/ 3.文档注释:/**--*/ javadoc有如下: 二.加注释的场景: 1. 基本注释(必须加) (a)类(接口)的注释 (b)构造函数的注释 (c)方法的注释 (d)全局变量的注释 (e)字段/属性的注释 2. 特殊必须加注释(必须加) (a)典型算法 必须有注释. (b)在代码不明晰处必须有注释. (c)在代码修改处加上修改标识的注释. (d)在循环和逻辑分支组成的代码中加注释.

java 注释规范 参照

1.注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范. 2.注释内容准确简洁 内容要简单.明了.含义准确,防止注释的多义性,错误的注释不但无益反而有害. 注释条件: 1.基本注释(必须加) (a) 类(接口)的注释 (b) 构造函数的注释 (c) 方法的注释 (d) 全局变量的注释 (e) 字段/属性的注释 备注:简单的代码做简单注释,注释内容不大于10个字即可,