<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 按照spring的HelloWorld搭建一个java项目。本节涉及的内容Car.java、House.java、Person.java三个bean类Car和house是Person的成员。MainTest.java含main方法的测试类。spring.xml容器的配置文件。(结尾有完整的代码)</span>
一、自动装配Bean
该表是autowired属性的每个取值的作用,下面来逐一讨论。
属性值 | 作用 |
byName | 通过查找与setter风格的属性相匹配的bean id来进行属性注入。 |
byType | 通过属性的类型查找与之匹配的bean,如果有多个bean的类型一样则会抛出异常。 |
constructor | 通过自己的带参构造器来查找类型匹配的bean,而且必须要完全匹配构造器的参数,同时以参数多的优先。 |
default | 表示与beans的设置autowired相同,或者沿用父类的设置。 |
no | 表示不使用该属性 |
1, 先来看一下xml文件的配置,这里先使用byName的形式。这种方式会通过Person的setCar和setHouse的方法与配置文件中bean的id进行匹配,然后匹配的car和house两个bean注入到person1的属性中去。(详细的代码见结尾,下同)
<bean id="person1" class="com.escore.beans.Person"
autowire="byType">
<property name="name" value="Jerry"></property>
</bean>
2,现在将autowired的取值更换为byType。这种方式则会通过Person的setCar和setHouse的方法的参数类型与配置文件的bean的class类型进行匹配,然后再注入相应属性。如果在匹配class类型时有多个则会出现错误。
3,如果是使用constructor的取值,则是通过Person的带参数的构造函数的参数进行匹配,本项目中,则是用Person(Car car, House house)来进行匹配。匹配的方式和byType一样。匹配的时候必须是该构造器全部参数都匹配上才可以,而且是尽量匹配参数多的构造器。
关于default和no就不再介绍了。前者是默认使用上一级的设置,注入的方式还是上面三种;no就是不使用该特性。
-----------------------------------------------------完整的代码----------------------------------------------------------------------------
Car.java
public class Car {
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public String toString() {
return "Car [brand=" + brand + "]";
}
}
House.java
public class House {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "House [address=" + address + "]";
}
}
Person.java
public class Person {
private String name;
private Car car;
private House house;
public Person() {
}
public Person(Car car1) {
this.car = car1;
}
public Person(Car car, House house) {
super();
this.car = car;
this.house = house;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
@Override
public String toString() {
return "Person [name=" + name + ", car=" + car + ", house=" + house + "]";
}
}
MainTest.java
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.escore.beans.Person;
public class MainTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
Person person = (Person) ctx.getBean("person1");
System.out.println(person);
ctx.close();
}
}
spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car" class="com.escore.beans.Car">
<property name="brand" value="BMW"></property>
</bean>
<bean id="house" class="com.escore.beans.House">
<property name="address"><value><![CDATA[<XiangJiangRod.168#>]]></value></property>
</bean>
<bean id="person1" class="com.escore.beans.Person"
autowire="byType">
<property name="name" value="Jerry"></property>
</bean>
</beans>