Spring @autowired注解

1、在接口实现类中,使用到@Autowired 注解,下面是该注解使用的类

2、Spring@Autowired注解与自动装配

@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性

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

@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

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

猜你喜欢

转载自my.oschina.net/hxflar1314520/blog/1801884