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

浙公网安备 33010602011771号