Bean的自动装配
自动装配
当Bean的属性很少的时候,我们对它进行配置的时候就使用很少的<constructor-arg>
或者<property>
元素进行装配,但是随着工程体积的增大,Bean也可能变得复杂,这时候配置文件也会变得复杂,<constructor-arg>
和<property>
就会变得很多,写起来就会很费劲,还好Spring为我们提供了自动装配的机制。
autowire的模式
Spring IOC容器可以自动装配Bean,只需要在<bean>
的autowire属性中指定装配的模式。
首先创建一个Person类,生成getter和setter方法,重写toString方法:
因为属性中依赖Address类和Car类,然后继续创建这两个类,生成getter方法和setter方法,重新toString方法:
接下来进行配置:
这是我们正常配置时候的样子,让我们运行一下:
结果没有问题。
这是例子比较简单,属性比较少,但是可以拓展思维的想象,如果属性很多的话,绿色矩形中的p标签就会越来越多,接下来我们就使用自动装配的功能。
Spring自动装配的模式有以下4种:
1. byName(根据名称自动装配):根据Bean的名字(或者id)和当前Bean的setter风格的属性进行
自动装配,如果有匹配的则进行装配,没有的匹配的则该属性不进行装配。
我们修改配置文件:
这样对于person,就会根据setter对应属性名字去和Bean进行匹配,通过id匹配address、通过name匹配car。运行一下:
没毛病,证明自动装配成功了。
我们修改一下address的名字然后运行一下:
由结果可以看到address的值为null,证明如果没有匹配到合适的Bean就不进行装配。
2. byType(根据类型自动装配):根据Bean的类型和当前Bean的属性的类型进行自动装配,若没有匹配的则不进行装配。
我们把autowire的方式修改为byType,运行一下:
看到虽然address的id为address1,但是最后还是装配成功了,因为byType匹配的是Bean的类型,但是这种方式存在问题,IOC容器中有一个以上的类型匹配的Bean,就会抛出异常,我们添加一个Bean,car2,然后发现编译器直接就报错了,运行更不要说了,抛出了org.springframework.beans.factory.NoUniqueBeanDefinitionException
异常,告诉我们匹配的Bean不是唯一的。
3. constructor(通过构造器自动装配):根据构造器入参的类型匹配相同类型的Bean进行注入,和byType类似,就不放截图了,当出现相同类型的多个Bean时也会有问题,当有多个构造器的时候情况也会很复杂,平时使用的很少。
4. autodetect:首先尝试使用constructor进行自动装配,如果失再尝试使用byType进行自动装配。
autowire的缺点
- 在Bean配置文件中涉及autowire属性进行自动装配将会配置Bean的所有属性,然而,若只希望装配个别属性时,autowire就不够灵活了。
- autowire要么根据类型自动装配要么根据名字自动装配,不能两者兼顾。
- 在一般情况下,在实际的项目中很使用自动装配的功能,因为和自动装配功能带来的好处比起来,明确清晰的配置文档更好一些。