两者作用
都是Spring生态里面实现bean的依赖注入
@autowired
是spring里面提供的一个注解,默认根据类型来实现bean的依赖注入。
@autowired注解里面有一个required属性,默认为true,表示强制要求bean实例的一个注入。在spring容器启动时,如果ioc容器里面不存在对应类型的bean实例,那么启动的时候就会报错,但我们不希望去实现自动驻入,可以把这个属性设为false。
另外,如果在ioc容器里面存在多个同类型的bean实例,由于@autowired注解是根据类型进行注入的,在spring容器启动的时候,会有一个错误提示:required a single bean, but 2 were found,大概意思是,原本只能注入一个单实例Bean,但是在ioc容器里面会有多个导致注入失败。
解决方法:使用@Primary注解和@Qualifier注解。@Primary表示主要的bean,当存在多个相同类型Bean的时候呢,优先使用声明了@Primary注解的bean。而@Qualifier注解类似于条件筛选,它可以根据bean的名字去找到需要装配的目标bean。
required a single bean, but 2 were found:
@Resource
@Resource是JDK里面提供的注解,只是spring在实现上提供了这种注解功能的一个支持,使用方式和@AutoWired注解的使用方式完全相同。
最大区别在于,@Resource可以支持ByName和ByType两种方式注入。如果使用name,spring会根据bean的名字去进行依赖注入,如果使用type,spring会根据类型来实现依赖注入。假设两个属性都没有配置的情况下,会优先根据定义的属性名字取匹配,匹配不到再根据类型去匹配,两种都没有匹配到就会报错。
总结
@AutoWired注解是根据类型进行匹配的,而@Resource这个注解可以根据name和type进行匹配,默认是name匹配。
@AutoWired注解是spring框架定义的注解,而@Resource注解是jsr 250规范里面定义的注解,只是spring对jsr 250规范提供了支持而已。
@AutoWired注解如果要根据name匹配,就需要配合@Primary注解或者@Qualifier注解来实现支持。
参考