Spring依赖注入 — 属性自动装配
设置属性值的三种基本方式:在Bean定义文件中使用指定字符串以及基本类型值。使用直接指定参考至其他Bean实例。使用标签指定value属性。 自动装配方式属性值说明byName容器将查找与属性名相同的Bean,然后自动注入到该属性中,如果没有找到,则该属性将不会被注入。当然,使用自动装配
设置属性值的三种基本方式:
- 在Bean定义文件中使用<value>指定字符串以及基本类型值。
- 使用<ref>直接指定参考至其他Bean实例。
- 使用<bean>标签指定value属性。
自动装配方式
属性值 | 说明 |
byName | 容器将查找与属性名相同的Bean,然后自动注入到该属性中,如果没有找到,则该属性将不会被注入。当然,使用自动装配时,也可以显式地注入Bean 的部分属性。 |
byType | 注入过程与byName 类似, 不同的是,容器查找的是与属性的设值方法参数类型兼容的Bean。 |
constructor | 容器将试图找出所有与构造方法的参数类型兼容的Bean ,然后确定某个合适的构造方法。如果没有符合调用任何构造方法所需的Bean,则容器将抛出UnsatisfiedDependencyException。 |
autodetect | 让容器全面自动判断。 |
no (默认值) | 不采用自动装配。 |
by Type
Person与Address类:
public class Person { private String name; private Address addr; // 此处省略各Field的getter、setter方法 } public class Address { private String city; private String province; // 此处省略各Field的getter、setter方法 } |
Bean配置:
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <property name="province" value="湖南"/> <property name="city" value="长沙"/> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="byType"> <property name="name" value="张三" /> </bean> |
可见,在上面Bean定义文件中并没有为id为person的Bean实例指定其addr属性,由于指定了autowire属性为byType,所以实例化id为person的Person实例时,Spring会自动注入其相应类型的实例。这种方法会导致Bean定义文件中的Address的类型定义只能出现一次。
byName
Bean配置
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <property name="province" value="湖南"/> <property name="city" value="长沙"/> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="byName"> <property name="name" value="张三" /> </bean> |
以指定byName 来绑定,则Spring会判断Bean 定义时id属性上指定的别名与Setter 名称是否一致来进行自动绑定。如果使用"byName"无法完成自动绑定,则对应的Setter 仅维持未绑定状态。
Constructor
Person类:
public class Person { private String name; private Address addr; public Person(Address addr) { this.addr = addr; } public Address getAddr() { return addr; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Bean配置
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <property name="province" value="湖南" /> <property name="city" value="长沙" /> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="constructor"> <property name="name" value="张三" /> </bean> |
由于“autowire”设置为"constructor",在建立依赖关系时,Spring容器会试图对比容器中的Bean实例类型,以及相关的构造方法上的参数类型,若在类型上符合,则选用该构造方法来建立Bean实例。
自动检测(autodetect)
可以看到,运用一些自动绑定的方式,可以缩短定义文件的编写内容,如果还想再偷懒的话,可以设置为"autodetect',一切交给Spring来判断。判断顺序:constructor——》 byType ——》 byName
<bean id="addr" class="cn.itcast.spring.auto_wire.Address"> <property name="province" value="湖南" /> <property name="city" value="长沙" /> </bean> <bean id="person" class="cn.itcast.spring.auto_wire.Person" autowire="autodetect"> <property name="name" value="张三" /> </bean> |
更多推荐
所有评论(0)