距离上一次更新Spring框架已经过去一个多月了,不是因为不想写,课设太多了,没有时间学习Spring,今天来更新一下Spring的内部bean注入和级联赋值
内部bean注入
内部bean有点类似Java的内部类,话不多说,通过例子来讲解。假设有两个类,一个是Dept类(部门类),有属性dname(String类型),一个是Emp类(员工类),有属性String ename、String gender,Dept dept(一个员工属于一个部门),Emp有方法showInfo(),打印员工的姓名、性别以及部门。并为这两个类的属性设置getter和setter方法。
Dept类
public class Dept {
public String dname;
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
Emp类
public class Emp {
public String ename;
public String gender;
public Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public Dept getDept() {
return dept;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void showInfo(){
System.out.println("ename ==> "+ename+",gender ==> "+gender+",dept ==> "+dept);
}
}
创建完成这两个类之后,在src目录下创建Spring config文件,具体在New->XML Configuration file->Spring Config,这里我将这个文件命名为bean1.xml 配置文件创建完成之后就是需要在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="Day02.bean.Emp">
<property name="ename" value="张三"></property>
<property name="gender" value="男"></property>
<property name="dept">
<bean id="dept" class="Day02.bean.Dept">
<property name="dname" value="安保部门"></property>
</bean>
</property>
</bean>
</beans>
可以看到,当属性不是基本数据类型,而是一个类时,在原有的bean标签中使用property标签,并给该标签的name属性赋值(一般为对象名,也可以不是),并在该property嵌套一个bean标签,该标签的id属性的值要与property的name标签的name属性值相同,我这里都是dept,之后在嵌套的bean标签中使用propperty标签来注入dept的dname属性。
下面编写测试代码
@Test
public void Test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Emp emp = context.getBean("emp", Emp.class);
emp.showInfo();
}
运行结果
级联赋值
其实刚刚的内部bean注入它本身也是属于级联赋值,级联赋值是向有关联的类中注入他的属性的值,比如和Emp类有关联的Dept类,那就是向Dept类中注入属性值,级联赋值有两种方式,具体看下面例子。
方式一
<?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="Day02.bean.Emp">
<property name="ename" value="张三"/>
<property name="gender" value="男"/>
<property name="dept" ref="dept"/>
</bean>
<bean id="dept" class="Day02.bean.Dept">
<property name="dname" value="安保部门"/>
</bean>
</beans>
在Emp类的bean标签中使用标签property,name属性同样设置为对象名,此时不再使用value上古星赋值,而是使用ref属性,同时需要在使用外部类注入的方法将Dept注入,此时将ref属性的值指向Dept类bean标签的id属性的值,即这两个属性值要相同。
下面同样编写测试代码,其实只要把上述bean1.xml,换成新的文件名就行
@Test
public void Test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Emp emp = context.getBean("emp", Emp.class);
emp.showInfo();
}
运行结果(两次结果其实一样)
方式二
<?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="Day02.bean.Emp">
<property name="ename" value="张三"></property>
<property name="gender" value="男"></property>
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="财务部"></property>
</bean>
<bean id="dept" class="Day02.bean.Dept">
<property name="dname" value="安保部门"/>
</bean>
</beans>
在Emp类的bean标签中使用property标签 name属性为对象名,使用ref标签,同样需要使用外部bean注入初始化Dept类,注意此时可以注入Dept的属性值,也可以不注入,将property的ref标签指向 Dept的bean标签的id属性后,在Emp中再次添加一个property标签,name属性值为dept.dname,也就是dept对象的dname属性,value属性给dname属性赋值 此时在Emp类中必须有Dept的getter和setter方法,不然会报错。要是Dept类不止一个属性就接着在后面继续添加property标签。
测试类也只是该xml文件名,这里就不写了,直接上运行结果
到这里内部bean和级联赋值就讲完了,我也是刚学完就直接写博客了,肯定有许多不足的地方请大家指正!
|