用于注入Bean的一些注解

Autowired

虽然我们现在开发的时候基本用不上这个注解(我们基本用构造函数注入),但是有些东西还是需要了解一下的。

  1. @Autowired默认按照类型去容器中找对应的组件,如果找到了多个相同的组件,将再按照属性的名称作为组件的id去容器中查找。在实验中,如果在容器中按照类型寻找到了多个组件,且此时这些组件的id和属性名不相等,则会报如下错误(这个时候Idea也会报红,注意下就好):

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.jj.demo.configuration.TempTmpConfiguration': Unsatisfied dependency expressed through field 'user'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.jj.demo.damain.User' available: expected single matching bean but found 2: user01,user02

  1. 可以通过@Qualifier注解,该注解会让@Autowire所有的默认行为都失效,而直接通过该注解给定的组件Id从容器中寻找。
1
2
3
4
5

@Autowired
@Qualifier("bookDao2")
private BookDao bookDao

  1. 使用了@Autowired注解,则容器中一定要有符合条件的组件进行装配,否则会报错。当然可以指定@Autowired的required参数为false。

  2. @Autowired是可以结合@Primary注解使用的,当我们注入Bean的时候,如果某个Bean上使用了@Primary注解,则@Autowired会有限注入该Bean(想一想,感觉这些注解的实现逻辑会错综复杂,也不知道Spring的开发团队是如何清晰的管理这些框架逻辑的)。在实验中,如果你同时为多个Bean标注了该注解,且注入的时候仅使用了@Autowired注解(我以为会回归到@Autowired的默认行为,看样子不行),则会抛如下的错误,此时如果使用@Qualifier,则不会抛出任何错误。


org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.jj.demo.configuration.TestTmpConfiguration': Unsatisfied dependency expressed through field 'user01'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.jj.demo.damain.User' available: more than one 'primary' bean found among candidates: [user01, user02]

  1. @Autowired可以注解在构造器、参数、方法上。
  • 标注在方法上时,如果该方法同时也被@Bean注解,则可以省略@Autowired注解(额,我大概能猜到原理)

  • 标注在构造器上时,如果组件只有一个有参构造器,则这个有参构造器上可以省略@Autowired(这个的原理不好猜)。

@Resource和@Inject

如下两个注解皆为Java规范,而@Autowired为Spring定义的:

  1. @Resource默认是按照组件名称进行装配的,不支持@Primary功能,不支持required=false参数。

  2. @Inject需要导入javax.inject包,和@Autowired的功能一样

自定义组件需要使用ApplicationContext、BeanFactory等

自定义组件实现xxxAware,在创建对象的时候,会调用接口规范的方法注入相关的组件。该方案主要用于将Spring底层的一些组件注入到自定义的Bean中。在实现层面,每个xxxAware基本都对应一个xxxAwareProcessor,例如ApplicationContextAware对应ApplicationContextAwareProcessor。

2021-07-14-18-02-32