Spring IOC Autowire
最近开始复习Spring,决定拾起之前学的一点Spring知识,并且深入了解这个框架。看了看【Spring Framework 开发参考手册】,觉得讲的还不错,决定先学习这个手册,掌握一些基础的Spring知识。
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有五种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥!
在xml配置文件中,可以在<bean/>元素中使用autowire属性指定:
| 模式 | 说明 |
|---|---|
| no | |
| byName | 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。 |
| byType | 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。 |
| constructor | 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
| autodetect | 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |
在bean中:
autowire=”"
<1>. byName: 匹配属性的名字与bean的id号进行匹配; 找set方法;
someBean中有一个ob的属性:
<bean id=”ob”>
<property name=”str1″>
<value>String1</value>
</property>
</bean>
<bean id=”someBean” autowire=”byName”>
<property name=”str1″>
<value>String1</value>
</property>
</bean>
<2>. byType: 寻找配置文件, 匹配的属性类型与bean一致; 找set方法;
上面例子改成byType 也是正确的, 并且ob可以改为别的名字;
如果在配置文件中找到符合条件的bean的个数超过一个,会报错;
<3>. constructor: 匹配构造器,看构造器的参数类型和配置文件bean的类型是否一致,
一致就成功,否则报错;匹配个数超过一个,也报错;提供一个构造器;
<4>. autodetect: 自动检测, 先构造器, 再set方法(也就是可以set方法和构造方法可以同时使用);
如果直接使用property和constructor-arg注入依赖的话,那么将总是覆盖自动装配。而且目前也不支持简单类型的自动装配,这里所说的简单类型包括基本类型、String、Class以及简单类型的数组(这一点已经被设计,将考虑作为一个功能提供)。byType和constructor自动装配模式也可用于数组和指定类型的集合。在这种情况下容器中的所有匹配的自动装配对象将被用于满足各种依赖。对于key值类型为 String的强类型Map也可以被自动装配。一个自动装配的Map的value值将由所匹配类型的bean所填充。而Map的key值则是相应的bean的名字。
自动装配还可以与依赖检查结合使用,这样依赖检查将在自动装配完成之后被执行。
理解自动装配的优缺点是很重要的。其中优点包括:
- 自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。
- 自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
自动装配的一些缺点:
- 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
- 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息.
- 自动装配搭配一个装配检查; 属性先检查, 出错后就不再进行了
simple :只检查基本类型属性是否装配成功;
objects:只检查Object类型是否装配成功;
all:全检查;既可以和自动装配一起使用, 也可以单独用来检查是否装配成功;
Recent Comments