Spring中bean的自动装配和兼容性

自动装配

手动装配: 以value或ref的方式明确指定属性值,都是手动装配
自动装配: 根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入到bean中.(注:只针对非字面量的属性,也就是使用ref)

1.1.bean相关的类: Car.java



package com.moon.ioc.auto;

public class Car extends CarExtends{
	private Integer cid;
	private String cname;
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	@Override
	public String toString() {
		return "Car [cid=" + cid + ", cname=" + cname + "]";
	}
	
}

CarExtend.java

package com.moon.ioc.auto;

public class CarExtends {

}

1.2 bean的相关类: Dept.java

package com.moon.ioc.auto;

public class Dept implements DeptI {
	private Integer did;
	private String dname;
	public Integer getDid() {
		return did;
	}
	public void setDid(Integer did) {
		this.did = did;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	@Override
	public String toString() {
		return "Dept [did=" + did + ", dname=" + dname + "]";
	}
	
}


DeptI.java


package com.moon.ioc.auto;

public interface DeptI {

}

Emp.java

package com.moon.ioc.auto;

public class Emp {
	private Integer eid;
	private String ename;
	
	private CarExtends car;
	private DeptI dept;
	public Integer getEid() {
		return eid;
	}
	public void setEid(Integer eid) {
		this.eid = eid;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public CarExtends getCar() {
		return car;
	}
	public void setCar(CarExtends car) {
		this.car = car;
	}
	public DeptI getDept() {
		return dept;
	}
	public void setDept(DeptI dept) {
		this.dept = dept;
	}
	@Override
	public String toString() {
		return "Emp [eid=" + eid + ", ename=" + ename + ", car=" + car + ", dept=" + dept + "]";
	}
	
	
	
}


2.1未使用自动装配的写法:通过ref

auto.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="emp" class="com.moon.ioc.auto.Emp">
		<property name="eid" value="1001"></property>
		<property name="ename" value="李逵"></property>
		<property name="car" ref="car"></property>
		<property name="dept" ref="dept"></property>
	</bean>

	<bean id="car" class="com.moon.ioc.auto.Car">
		<property name="cid" value="2001"></property>
		<property name="cname" value="卡罗拉"></property>
	</bean>
	
	
	<bean id="dept" class="com.moon.ioc.auto.Dept">
		<property name="did" value="3001"></property>
		<property name="dname" value="开发部"></property>
	</bean>
</beans>


测试代码: Test.java

package com.moon.ioc.auto;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("auto.xml");
		Emp emp = ac.getBean("emp", Emp.class);
		System.out.println(emp);
	}
}

2.2使用自动装配,通过属性autowire="byName"
属性名和要自动装配的bean的id名一致时,可以自动装配

auto.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">
	
	<!-- 
		autowire="byName": 属性名和要自动装配的bean的id名一致时,可以自动装配
		autowire="byType": 通过Spring容器中bean的类型,为兼容性的属性赋值
		
		兼容性:指的是类中的成员属性是接口或者父类,配置文件的bean(要装配的)是接口的实现类或者父类的子类可以自动装配
		完成赋值
		
		
		当为bean设置了autowire时,会作用于该bean中所有的非字面量属性 因此谁都不用
		
	-->
	<bean id="emp" class="com.moon.ioc.auto.Emp" autowire="byName">
		<property name="eid" value="1001"></property>
		<property name="ename" value="李逵"></property>
	</bean>

	<bean id="car1" class="com.moon.ioc.auto.Car">
		<property name="cid" value="2001"></property>
		<property name="cname" value="霸道"></property>
		
	</bean>
	
	<bean id="car2" class="com.moon.ioc.auto.Car">
		<property name="cid" value="2002"></property>
		<property name="cname" value="红旗"></property>
	</bean>
	
	<bean id="dept" class="com.moon.ioc.auto.Dept">
		<property name="did" value="3001"></property>
		<property name="dname" value="开发部"></property>
	</bean>
</beans>

测试代码:Test.java不变

posted @ 2021-09-06 22:27  逆风的悦  阅读(104)  评论(0)    收藏  举报