IOC容器 - Bean管理XML方式 - 外部Bean

IOC容器 - Bean管理XML方式 - 外部Bean

外部bean

  1. 创建一个Service类和Dao接口及其实现类DaoImpl类
  2. Service中有一个Add方法,Dao中有一个Update接口
  3. 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类似

  1. Dept类
  2. Emp类
  3. Emp类包含一个Dept属性
  4. 通过外部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方法

创建完成后之前的错误就消失了
运行代码输出正常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA小菜鸡223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值