Spring-4:bean的自动装配及一些问题

来源:互联网 发布:数据选择器 数据开关 编辑:程序博客网 时间:2024/05/21 06:55

在XML文件中配置bean的自动装配:

准备三个测试类:

package com.atguigu.spring.beans.autowire;public class Address {private String city;private String street;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}@Overridepublic String toString() {return "Address [city=" + city + ", street=" + street + "]";}}

package com.atguigu.spring.beans.autowire;public class Car {private String brand;private double price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Car [brand=" + brand + ", price=" + price + "]";}}

package com.atguigu.spring.beans.autowire;public class Person {private String name;private Address address;private Car car2;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Car getCar() {return car2;}public void setCar(Car car2) {this.car2 = car2;}@Overridepublic String toString() {return "Person [name=" + name + ", address=" + address + ", car=" + car2+ "]";}}


Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式,模式有三种:

1、byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id = "address" class="com.atguigu.spring.beans.autowire.Address" p:city="NanJing" p:street="AndeMen"></bean><bean id = "car2333" class="com.atguigu.spring.beans.autowire.Car" p:brand="Aodi" p:price="300000"></bean><bean id="person" class="com.atguigu.spring.beans.autowire.Person" p:name="petter" autowire="byName"></bean></beans>
只要类型一致即可,但是如果类型对应多个bean,会出异常。

2、byName(根据名称自动装配): 

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id = "address" class="com.atguigu.spring.beans.autowire.Address" p:city="NanJing" p:street="AndeMen"></bean><bean id = "car2" class="com.atguigu.spring.beans.autowire.Car" p:brand="Aodi" p:price="300000"></bean><bean id="person" class="com.atguigu.spring.beans.autowire.Person" p:name="petter" autowire="byName"></bean></beans>
注意事项:
这里有一个id为car2的bean,person类中有一个属性为car2,但是输出如下:


可见并没有自动装配成功,如果将xml文件中的Car类的bean的id改为car,无论Person中Car类的引用名改成什么(比如car2),都可以自动装配。

在xml将第一个Car类的bean的id改为car,并新加一个bean:

<bean id = "car2" class="com.atguigu.spring.beans.autowire.Car" p:brand="baoma" p:price="500000"></bean>

输出如下:


仍然自动装配第一个bean,由此我推测byName自动装配应该是根据类名找bean的。


3、constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用


总结:bean自动装配看似方便,但是灵活性较差,也不能对引用的bean中某个属性单独设置,如果某个类对应多个bean还会报异常。所以在项目开发中还是尽量不要使用。

0 0
原创粉丝点击