@Autowired
@Autowired是什么
@Autowired 表示某个属性书否需要进行依赖注入,可以写在属性和方法上。注解中的required属性默认为true,表示如果没有对象可以注入给属性则抛异常
@Autowired赋值过程
1、Autowired加在某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了Autowired的属性自动给属性赋值
Spring会根据属性的类型去Spring的容器中找出该类型所有的Bean对象,如果找出多个则在根据属性的名字从多个中确定一个,如果required为true并且根据属性信息找不到对象则抛出异常。
2、Autowired加在某个方法上时,Spring在进行Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器中找到对象当做方法的入参,自动反射调用该方法。
3、Autowired加在构造方法上时,Spring会在推断构造方法阶段选择该构造方法进行实例化,在反射调用构造方法之前,会根据构造方法的参数类型,参数名从Spring容器中找到Bean对象,当做构造方法入参。
@Resource是什么
@Resource和@Autowired 类似,也是用来进行依赖注入的。@Resource是java所提供的注解 ,@Autowired 是Spring提供的,他们依赖注入的底层实现不同
@Resource赋值过程
#Resource注解中有一个name属性,针对name属性是否有值,@Resource依赖注入的底层流程是不同的。
如果name属性有值,那么Spring会直接根据所指定的name值去Spring容器中找Bean对象,如果找到了则成功否者就会抛出异常
如果name属性没有值
1、先判断该属性名字在Spring容器中是否存在Bean对象
2、如果存在,则成功找到Bean对象进行注入
3、如果不存在,则根据属性类型去Spring容器中找Bean对象吗,找到一个则进行注入
@Value是什么
@Value和@Autowired、@Resource类似,也是用来对属性进行注入的,只不过@Value是用来从Properties文件中来获取值的,并且@Value可以解析SpEL(Spring表达式)
例:
1、@Value(“xiaoxiong”)
直接将字符串"xiaoxiong"赋值给属性,如果属性类型不是String,或无法进行类型转换,则报错
2、@Value("$ {xiaoxiong}")
将会把{}中的字符当做key从Properties文件中找出对应的Value赋值给属性如果没有找到则会把"$ {xiaoxiong}“当做普通字符赋值给属性
3、@Value(”#{xiaoxiong}")
会将#{}中的字符串当做Spring表达式进行解析,Spring会把xiaoxiong当做beanName,并从Spring容器中找到对应的Bean,如果找到则进行属性注入,没有找到则报错