您的位置:首页 > 编程语言 > Java开发

学习Spring(三) -- Spring的自动装配

2016-04-15 00:00 513 查看
摘要: 学习了使用autowire属性提供自动装配功能。

在spring中,可以不显示的为bean初始化属性,而是通过autowire去自动寻找配置文件中,合适的数据来初始化。具体来看一个例子,学生类中包含一个地址类。

地址类:

package cn.net.bysoft.lesson2;

public class Address {

@Override
public String toString() {
return "Address [name=" + name + "]";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

private String name;
}

学生类:

package cn.net.bysoft.lesson2;

public class Student {

@Override
public String toString() {
return "Student [name=" + name + ", address=" + address + "]";
}

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;
}

private String name;
private Address address;
}

下面使用自动装配来初始化学生类:

<!-- 自动装配autowire -->
<bean id="address" class="cn.net.bysoft.lesson2.Address" p:name="beijing"></bean>
<bean id="student" class="cn.net.bysoft.lesson2.Student" p:name="Lucy"
autowire="byType"></bean>

使用autowire=byType来自动选择合适类型的bean来初始化student,也就是说在student中,有类型是Address的字段,spring自动在配置文件中搜索类型是Address的对象,搜索到后初始化给student类。

@Test
public void testAutowireByType() {
Student student = (Student) ctx.getBean("student");
System.out.println(student);
/**
* output:Student [name=Lucy, address=Address [name=beijing]]
* */
}

使用
7fe0
byType有一个需要注意的地方,如果一个配置文件中,有重复的类型,则初始化会报错,比如在配置文件中有2个address对象:

<!-- 自动装配autowire -->
<bean id="address" class="cn.net.bysoft.lesson2.Address" p:name="beijing"></bean>
<bean id="address2" class="cn.net.bysoft.lesson2.Address" p:name="shanghai"></bean>
<bean id="student" class="cn.net.bysoft.lesson2.Student" p:name="Lucy"
autowire="byType"></bean>

@Test
public void testAutowireByType() {
Student student = (Student) ctx.getBean("student");
System.out.println(student);
/**
* exception:警告: Exception encountered during context initialization -
* cancelling refresh attempt:
* org.springframework.beans.factory.UnsatisfiedDependencyException:
* Error creating bean with name 'student' defined in class path
* resource [applicationContext.xml]: Unsatisfied dependency expressed
* through bean property 'address': : No qualifying bean of type
* [cn.net.bysoft.lesson2.Address] is defined: expected single matching
* bean but found 2: address,address2; nested exception is
* org.springframework.beans.factory.NoUniqueBeanDefinitionException: No
* qualifying bean of type [cn.net.bysoft.lesson2.Address] is defined:
* expected single matching bean but found 2: address,address2
* */
}

这是在初始化会有一个异常,spring告诉我们找到了两个bean。分别是address和address2。

在这种时候,可以将autowire="byType"设置成autowire="byName",让spring通过student的字段名称进行匹配,也就是说,如果student类中的Address类型的字段叫address的话,会初始化beijing这个address。而如果Student类中的Address类型的字段叫address_new的话,会去配置文件中查找bean的id为address_new的对象,然后初始化给student类。

修改一下student类:

package cn.net.bysoft.lesson2;

public class Student {

@Override
public String toString() {
return "Student [name=" + name + ", address=" + address_new + "]";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddress_new() {
return address_new;
}

public void setAddress_new(Address address_new) {
this.address_new = address_new;
}

private String name;
private Address address_new;
}

在将byType修改为byName,进行测试:

<!-- 自动装配autowire -->
<bean id="address" class="cn.net.bysoft.lesson2.Address" p:name="beijing"></bean>
<bean id="address2" class="cn.net.bysoft.lesson2.Address" p:name="shanghai"></bean>
<bean id="address_new" class="cn.net.bysoft.lesson2.Address" p:name="guangzhou"></bean>
<bean id="student" class="cn.net.bysoft.lesson2.Student" p:name="Lucy"
autowire="byName"></bean>

@Test
public void testAutowireByName() {
Student student = (Student) ctx.getBean("student");
System.out.println(student);
/**
* output:Student [name=Lucy, address=Address [name=guangzhou]]
* */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: