[Java2023] T5.11-IOC控制反转和DI依赖注入

96 阅读1分钟

控制反转-IOC:

  • Inversion Of Control 对象的创建控制权, 由程序自身创建(new ClassName), 转移到外部(容器)

依赖注入-DI

  • Dependency Injection, 容器为应用程序提供运行时, 所依赖的资源

Bean对象:

  • IOC容器中创建, 管理的对象

实现步骤

  • 1.先给Service的实现类ServiceA和DAO的实现类DaoA加上注解: @Compent (表示将类交给IOC容器管理, 成为容器中的Bean)
package com.itheima.service.impl;
import com.itheima.dao.EmpDao;
import com.itheima.dao.impl.EmpDaoA;
import com.itheima.pojo.Emp;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component //表示将类交给IOC容器管理, 成为容器中的Bean
public class EmpServiceA implements EmpService {
    // 非IOC方式
    // private EmpDao empDao = new EmpDaoA();
    // IOC方式, 不需要new对象
    @Autowired // // 运行时, IOC容器会提供改类型的bean对象, 并赋值给该变量 - 依赖注入
    private EmpDao empDao;
    @Override
    public List<Emp> listEmp() {
        // 1.调用dao获取数据
        List<Emp> empList = empDao.listEmp();
        // 2.数据处理 -省略代码
        return empList;
    }
}
package com.itheima.dao.impl;
import com.itheima.dao.EmpDao;
import com.itheima.pojo.Emp;
import com.itheima.utils.XmlParserUtils;
import org.springframework.stereotype.Component;
import java.util.List;
@Component  // 表示将类交给IOC容器管理, 成为容器中的Bean
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        // 1.加载并解析xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        return empList;
    }
}
  • 2.然后给调用上面类的地方, 使用DI的方式给变量赋值, 而不是使用New 的方式
package com.itheima.controller;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.service.impl.EmpServiceA;
import com.itheima.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
    // 非IOC方式, 需要new 对象
    //private EmpService empService = new EmpServiceA();
    @Autowired // 运行时, IOC容器会提供改类型的bean对象, 并赋值给该变量 - 依赖注入
    private EmpService empService;
    @RequestMapping("listEmp")
    public Result list()
    {
        // 1.调用service, 获取数据
        List<Emp> empList = empService.listEmp();
        // 3.响应数据
        return Result.success(empList);
    }
}
  • 3.运行

图解

image.png