IOC容器 - Bean管理XML方式 - 外部Bean
外部bean
- 创建一个Service类和Dao接口及其实现类DaoImpl类
- Service中有一个Add方法,Dao中有一个Update接口
- Service.Add内执行时会调用Dao的Update接口
具体类实现:
Service
package com.xjy.spring.IOC.Service;
import com.xjy.spring.IOC.DAO.DAO;
public class Service {
private DAO DaoTest;
public void Add(){
System.out.println("Start!");
DaoTest.update();
}
public void setDaoTest(DaoImpl daoTest) {
DaoTest = daoTest;
}
}
Dao Interface
package com.xjy.spring.IOC.DAO;
public interface DAO {
public void update();
}
Dao实现类DaoImpl
package com.xjy.spring.IOC.DAO;
public class DaoImpl implements DAO {
@Override
public void update() {
System.out.println("Data Update!");
}
}
XML配置
<!--IOC-外部Bean-->
<!--创建Service和-DaoImpl对象-->
<bean id="service" class="com.xjy.spring.IOC.Service.Service"></bean>
<bean id="daoImpl" class="com.xjy.spring.IOC.DAO.DaoImpl"></bean>
由于Service中的成员变量为Dao对象类型,所以先前的Value属性无法为其注入参数。
这里需要引入外部标签属性ref
写法如下:
<bean id="service" class="com.xjy.spring.IOC.Service.Service">
<property name="daoTest" ref="daoImpl"></property>
</bean>
<bean id="daoImpl" class="com.xjy.spring.IOC.DAO.DaoImpl"></bean>
- ref:对象类型所在的bean标签的id值
ref的值为所要注入的对象类型的Bean标签的id值
即第二行ref的值是最后一行Bean标签的id值:daoImpl
这就是外部标签
测试
编写主函数:
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("SpringConfig.xml");
Service service = context.getBean("service",Service.class);
service.Add();
}
输出:
Start!
Data Update!
进程已结束,退出代码0
内部bean
和外部bean类似
- Dept类
- Emp类
- Emp类包含一个Dept属性
- 通过外部Bean实现
类实现:
Dept
package com.xjy.spring.IOC.Employee;
import com.xjy.spring.IOC.Dept.Dept;
public class Employee {
private String EmpName;
private String Gender;
public Dept DeptName;
public void setEmpName(String empName) {
EmpName = empName;
}
public void setGender(String gender) {
Gender = gender;
}
public void setDeptName(Dept deptName) {
DeptName = deptName;
}
}
Dept
package com.xjy.spring.IOC.Dept;
public class Dept {
public String DeptName;
public void setDeptName(String deptName) {
DeptName = deptName;
}
}
配置XML
<!--IOC-内部Bean-->
<!--创建对象-->
<bean id="employee" class="com.xjy.spring.IOC.Employee.Employee">
<property name="empName" value="Tom"></property>
<property name="gender" value="男"></property>
<property name="deptName">
<bean name="dept" class="com.xjy.spring.IOC.Dept.Dept">
<property name="deptName" value="技术部门"></property>
</bean>
</property>
</bean>
内部类使用方法
在property中创建对象属性对应的Bean标签并为其对象所属类的成员变量赋值
测试输出
测试类:
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("SpringConfig.xml");
Employee emp = context.getBean("employee",Employee.class);
emp.getInfo();
}
输出:
Tom::男::Dept{DeptName='技术部门'}
进程已结束,退出代码0
级联赋值
级联赋值有两种方法
第一种
第一种其实就是最先说的外部Bean方法,可以参照上方外部bean
第二种
第二种方法是一个简化方法,但需要编写成员变量的get方法。
配置XML
首先代码不变,修改XML方法:
前两个姓名和性别设置不变,只需要变动第三个部门名称以及添加一个dept外部标签和dept类的bean标签
<bean id="employee" class="com.xjy.spring.IOC.Employee.Employee">
<property name="empName" value="Tom"></property>
<property name="gender" value="男"></property>
<property name="deptName" ref="dept"></property>
<property name="deptName.deptName" value="技术部"></property>
</bean>
<bean id="dept" class="com.xjy.spring.IOC.Dept.Dept"></bean>
如果直接这么写,在xml中会报错
这是因为xml无法得到DeptName变量,所以我们需要在类中创建get方法
创建完成后之前的错误就消失了
运行代码输出正常