Spring学习记录(三)---bean自动装配autowire
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref
autowire:
no ---默认情况,不自动装配,通过ref手动引用
byName---根据名字自动装配
byType---根据类型自动装配
constructor---根据构造函数参数的数据类型,进行byType模式的自动装配。 (麻烦,不推荐)
autodetect--- 首先尝试使用constructor进行自动装配,如果失败,再使用byType进行自动装配(麻烦,不推荐)
看一个例子:Person类有name属性、Car对象属性、Address对象属性
package com.guigu.spring.autowire;
// Car类
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;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
}
package com.guigu.spring.autowire;
// Address 类
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;
}
@Override
public String toString() {
return "Address [city=" + city + ", street=" + street + "]";
}
}
package com.guigu.spring.autowire;
// Person类
public class Person {
private String name;
private Car car;
private Address address; 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 Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Person [car=" + car + ", address=" + address + "]";
}
}
public class Main {
// main
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("autowire.xml");
Person person = (Person) ctx.getBean("person");
System.out.println(person);
}
}
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<!-- 手动装配
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
-->
<!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byName"></bean> </beans>
结果会输出正确toString信息。
补充一下 P:city ,这是用p命名空间,配置属性更简便
<bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean> <!--等同于-->
<bean id="address" class="com.guigu.spring.autowire.Address">
<property name="city" value="BeiJing"></property>
<property name="street" value="HuiZhou"></property>
</bean>
继续说自动装配,autowire="byName"达到了和手动装配一样的效果。
它的匹配方法是依据person类有两个属性,一个是address,一个是car,正好有两个bean名字就是对应两个属性名,就会自动匹配上了。
缺点是当bean的id变成address1,返回null,因为名字不匹配。。
<bean id="address1" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car1" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<!-- 手动装配
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
-->
<!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byType"></bean>
这样,即使名字不能匹配,但可以用类型匹配。person类有两个属性,一个是Address类,一个是Car类,正好前面两个bean是这样类型的,就匹配上了。不管它们叫什么名字
缺点是,若前面有多个Car类,那它就不知道匹配谁了,会报异常。。如下
<bean id="address" class="com.guigu.spring.autowire.Address"
p:city="BeiJing" p:street="HuiZhou"></bean>
<bean id="car" class="com.guigu.spring.autowire.Car"
p:brand="Audi" p:price="200000"></bean>
<bean id="car1" class="com.guigu.spring.autowire.Car"
p:brand="Baoma" p:price="300000"></bean> <!-- 自动装配 -->
<bean id="person" class="com.guigu.spring.autowire.Person"
p:name="Tom" autowire="byType"></bean>
缺点:
1、autowire属性将自动装配bean的所有属性,若只希望装配个别属性时,显得不那么灵活。
2、一般用byName或byType,不能二者一起用
在实际中较少用,在一些整合框架中用到。
Spring学习记录(三)---bean自动装配autowire的更多相关文章
- Spring学习(三)—— 自动装配案例分析
Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,construct ...
- Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
- Spring学习日志之Bean的装配
Spring容器负责创建应用程序中的bean并通过依赖注入来协调这些对象之间的关系.但是,作为开发人员,要告诉Spring需要创建哪些bean并且如何将其装配在一起.当描述bean如何装配时,Spri ...
- Spring Boot(三)自动装配
@Configuration和@Bean Spring提供了注解@Configuration和@Bean注解用来配置多个Bean,在以前的Spring项目中可以通过xml的方式配置: <bean ...
- Spring学习记录(五)---bean的作用域scope
作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...
- Spring学习记录(四)---bean之间的关系:继承、依赖
继承 这里说的继承和java的继承是不一样的,不是父类子类.但思想很相似,是父bean和子bean 1.父bean是一个实例时.它本身是一个完整的bean 2.父bean是模板,抽象bean ...
- Spring学习记录(八)---Bean的生命周期
之前说过,在调用下面时,就创建了容器和对象 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml&quo ...
- Spring学习记录(三)
一.AOP的整理总结 aop面向切面编程 横向重复代码,纵向抽取 动态代理 1.通过动态代理可以体现aop思想 2.为什么要哦用动态代理:对目标对象中的方法进行增强 spring aop开发 spri ...
- spring——bean自动装配
注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...
随机推荐
- Yii框架 400 错误
YII 400错误 在YII框架中400错误是csrf校验失败的意思 csrf是什么? CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Cli ...
- C# 使用access,报错:标准表达式中数据类型不匹配
最初以为是数字类型造成的,结果最后才发现是日期格式错误,这是我的参数 db.AddInParameter(dbCommand, "savedate", DbType.DateTim ...
- Redis安装配置(Windows版)
近期项目中引入Redis,故记录下来,方便日后查看. 可参考(http://www.cnblogs.com/happyday56/p/3916388.html)不说废话,直奔主题. 一.安装前的准备: ...
- js库
lanchpad用的js库 http://lesscss.org/ https://github.com/EightMedia/hammer.js/wiki/Getting-Started http: ...
- HOW TO RUN A SPRINT PLANNING MEETING (THE WAY I LIKE IT)
This is a sample agenda for a sprint planning meeting. Depending on your context you will have to ch ...
- 数字对象NSNumber
//将int类型转化成对象 ; NSNumber *numberString = [NSNumber numberWithInt:number]; //对象是可以放入数组的 NSArray *arra ...
- Hello Bugs
2014-01-09 [Maven]Not Authorized ReasonPhame: Failed to decrypt password... 描述:eclipse中使用maven进行mvn ...
- ajax 全套
ajax简介 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编程语言, ...
- jquery修改Switchery复选框的状态
script //选择框 var mySwitch; /* * 初始化Switchery * * classNmae class名 */ function initSwitchery(classNam ...
- PHP之几道面试题
1.二分查找算法 function two_find($arr,$low,$height,$k){ if($low<=$height){ $mid = intval(($low+$height) ...