学习Spring(三) -- Spring的自动装配
2016-04-15 00:00
513 查看
摘要: 学习了使用autowire属性提供自动装配功能。
在spring中,可以不显示的为bean初始化属性,而是通过autowire去自动寻找配置文件中,合适的数据来初始化。具体来看一个例子,学生类中包含一个地址类。
地址类:
学生类:
下面使用自动装配来初始化学生类:
使用autowire=byType来自动选择合适类型的bean来初始化student,也就是说在student中,有类型是Address的字段,spring自动在配置文件中搜索类型是Address的对象,搜索到后初始化给student类。
使用
7fe0
byType有一个需要注意的地方,如果一个配置文件中,有重复的类型,则初始化会报错,比如在配置文件中有2个address对象:
这是在初始化会有一个异常,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类:
在将byType修改为byName,进行测试:
在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]] * */ }
相关文章推荐
- Jeecg中使用<t: dgCol>标签的自动构造查询条件时出现类型转换错误的解决办法。
- 使用Eclipse的几个必须掌握的快捷方式
- struts2部分总结
- Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory
- SpringMVC+Mybatis声明式事务分析
- SpringMVC注解
- Spring MVC控制流程与简易配置方案
- JAVA——构造方法
- JAVA——接口
- java反射详解
- java 学习笔记
- 轻松带你走进shiro的世界
- JAVA为什么会空指针异常
- Java 密码扩展无限制权限策略文件
- 关闭Eclipse的控制台console自动跳出
- Java入门 第二季第三章 继承
- springmvc spring mybatis 添加ehcache
- 使用JDK8新特性重构你的代码
- 【LeetCode】299 Bulls and Cows (java实现)
- eclipse项目build时,提示错误.