@Resource 和 @Autowired 这两个注解的作用都是Spring生态里面去实现 Bean 的依赖注入
@Autowired注解的作用
@Autowired是Spring里面提供的一个注解,它默认是根据类型来实现Bean的依赖注入。
@Autowired注解里面有一个required属性,它的默认值是true,表示强制要求Bean实例的注入,在应用启动的时候如果IOC容器里面不存在对应类型的Bean,那么启动的时候就会报错。
如果我们不希望去实现自动注入,可以把这个属性设置为false。
如果在Spring IOC容器里面存在多个相同类型的Bean实例,由于@Autowired注解它是根据类型来注入Bean实例的,所以Spring容器启动的时候会提示一个错误,大概的意思是原本只能注入一个单实例Bean但是在IOC容器里面有多个导致注入失败。
当然针对这个问题我们可以使用 @Primary 或者 @Qualifier 这两个注解来解决
@Primary表示主要的Bean,当存在多个相同类型Bean的时候,优先使用声明了@Primary注解的一个Bean
而@Qualifier注解类似于条件筛选,它可以根据Bean的名字去找到需要装配的目标Bean。
@Resource注解的作用
@Resource是JDK里面提供的注解,只是Spring在实现上提供了这种注解功能的一个支持,它的使用方式和@Autowired注解的使用方式是完全相同的,最大的差异化在于@Resource可以支持 ByName 和 ByType 两种注入方式。
如果使用Name,Spring会根据Bean的名字去进行依赖注入,如果使用Type,Spring会根据类型来进行依赖注入。
假设两个属性都没有配置的情况下它会先根据定义的属性名字去匹配,如果没有匹配成功再根据类型来匹配,如果两个都没有匹配到的话就会报错。
总结
- @Autowired注解是根据类型来匹配的,而@Resource注解可以根据Name和Type来匹配,默认是Name匹配。
- @Autowired注解是Sping里面定义的注解,而@Resource注解是JSR 250规范里面定义的注解,只是Spring对JSR 250规范提供了支持而已。
- @Autowired注解如果需要支持Name匹配就需要配合@Primary或者@Qualifier注解来实现。