XML配置里的 Bean自动装配
自动装配: 只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成
•Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在<bean> 的 autowire属性里指定自动装配的模式
•byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
•byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
•constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂.不推荐使用
那么在xml文件中<bean>文件中,属性autowire=" ", " "内可以是byName或byType 等
——byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配.
——byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配
在使用 XML 配置时, 自动转配用的不多. 但在基于 注解 的配置时, 自动装配使用的较多
例子:car和address,person类,其中person类中有car和address
car类
address类public class Car { private String name; private String brand; private int price; //省略get和set方法 @Override public String toString() { return "Car [name=" + name + ", brand=" + brand + ", price=" + price + "]"; } }
person类public class Address { private String city; private String street; //省略get和set方法 @Override public String toString() { return "Address [city=" + city + ", street=" + street + "]"; } }
xml文件的配置如下public class Person { private String name; private int age; private Address address; private Car car; //省略get和set方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + ", car=" + car + "]"; } }
上面就是一段完整的是autowire的方法。这样可以减少代码的编写,但是同样也就缺点,<bean id="car" class="com.beans.autowire.Car"> <property name="name" value="audi"></property> <property name="brand" value="shanghai"></property> <property name="price" value="300000"></property> </bean> <bean id="address" class="com.beans.autowire.Address"> <property name="city" value="shanghai"></property> <property name="street" value="nanjinglu"></property> </bean> <bean id="person" class="com.beans.autowire.Person" autowire="byName"> <property name="name" value="xiaoming"></property> <property name="age" value="22"></property> <!-- 如果不使用自动装配会有下面的配置代码,启用了autowire则不需要了 --> <!-- <property name="address" ref="address"></property> <property name="car" ref="car"></property> --> </bean>
•在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.•autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.•一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些