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不变

浙公网安备 33010602011771号