前边我们讲过了使用注解的方式来为类创建一个bean的实例,使其被SpringIOC容器管理。即先使用注解标注在类上,然后使用<context:component-san>标签指定Spring扫描的包及其子包的类。下边我们来讲一讲如何使用注解的方式来为bean的属性赋值,即如何使用注解的方式指定bean之间的关联关系。

  <context:component-scan>这个配置在IOC配置文件中的标签,除了可以指定要扫描的组件之外呢,它还有一个很重要的功能,就是会自动注册一个AutowiredAnnotationBeanPostPorcessor后置处理器的实例,这个后置处理器可以自动的装配具有@Autowired/@Resource/@Inject的属性----即将存在于IOC容器中的bean的实例于相同属性类型的变量装配起来,即划等号。

  在这三种注解中,@Autowired注解是最常见的注解。其实他们三个注解的功能都是一样的,我们常用@Autowired,所以我们着重来讲一讲它。

  1. 功能

  @Autowired的功能是:可以自动装配具有兼容类型的单个bean的属性。即被@Autowired注解标注的属性,Spring会自动的从当前IOC容器中寻找匹配的属性类型,然后将其赋值给这个属性。

  2. 使用范围

  @Autowired注解可以写在属性上、构造方法上、一切具有参数的方法上(如setter方法)。

  3. 特性

  默认情况下,所有被@Autowired注解标注的属性,都必须在IOC容器中可以找到对应的属性类型的bean,否则会报异常,因为一旦@Autowired注解添加到属性上,当IOC容器初始化时,Spring的自动匹配机制就会触发,找不到就会包notfoundbean异常。如果我们不希望某个属性不被设置也不会出异常,可以在这个属性的@Autowired注解中添加属性required="false"。

  ④ 冲突

  当IOC容器中存在多个与被@Autowired注解的属性(接口)的类型相同的bean(接口的实现类),那么Spring会去找默认的非限定类名去匹配属性(这个非限定类名可以使用value属性设定),如果不存在这个首字母小写的非限定类名,也可以在set方法中的形参前加上@Qualify(beanName)来指定这个形参中属性对应的bean的名称、

 ⑤ 作用于数组、集合、Map

  当@Autowired注解定义在数组类型的属性上时,Spring会将所有和数组类型匹配的bean都装配到这个数组中

  当@Autowired注解定义在集合类型的属性上时,Spring会检查集合的类型,然后将IOC中所有满足这个类型bean都装配到这个集合中

 当@Autowired注解定义在Map类型的属性上时,Spring会检查Map的值的类型,然后将所有满足条件的bean以beanName-bean的形式放到这个Map属性中

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐