【SpringBootWeb入门-10】分层解耦-IOC&DI入门

发布时间 2023-12-12 00:48:52作者: hiker0412

1、入门前言

上一篇我们讲解了分层解耦的思想并且引出了两个概念:控制反转IOC依赖注入DI,本篇我们需要将思想落地为具体的代码实现,接下来我们将进入IOC与DI的入门程序。

在入门程序当中,我们主要要完成的就是Conroller层与Service层的解耦,以及Service层与DAO层的解耦,要想完成代码的解耦,我们就要将原来new对象的代码段删掉:Conroller中new了一个Service对象,Service中new了一个DAO对象,这些都需要删除掉。

但我们仅仅删除掉这些代码,还不能完成解耦工作,原因是程序运行时还会报一个对象空值(未赋值),接下来我们将以IOC与DI来完成解耦操作。

2、解耦操作

还记得我们上一篇中IOC与DI思想中存在两个问题:

1、EmpService对象怎么交给容器来管理(Service层 及 Dao层的实现类,交给IOC容器管理);

2、容器怎么来提供给Controller程序它所依赖的资源(为Controller及Service注入运行时所依赖的对象)。

我们按照这两个问题来逐一处理:

  • 首先怎么交给容器来管理:在Service层与DAO层加上@Component注解;
  • 然后怎么提供程序所依赖的资源:为Controller以及Service注入运行时所需要的类对象,只需要加上@Autowired注解即可。

通过上述两步即可完成IOC与DI对原三层架构的解耦操作。

3、代码实现

Dao层的实现类,交给IOC容器管理

package com.hiker.dao.impl;

import com.hiker.dao.EmpDao;
import com.hiker.pojo.Emp;
import com.hiker.utils.XmlParserUtils;
import org.springframework.stereotype.Component;

import java.util.List;

@Component // 将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        //1. 加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        return empList;
    }
}
View Code

Service层的实现类,交给IOC容器管理,并且注入运行时所依赖的对象

package com.hiker.service.impl;

import com.hiker.dao.EmpDao;
import com.hiker.dao.impl.EmpDaoA;
import com.hiker.pojo.Emp;
import com.hiker.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component // 将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpServiceA implements EmpService {


    @Autowired // 运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
    private EmpDao empDao ;

    @Override
    public List<Emp> listEmp() {
        //1. 调用dao, 获取数据
        List<Emp> empList = empDao.listEmp();

        //2. 对数据进行转换处理 - gender, job
        empList.stream().forEach(emp -> {
            //处理 gender 1: 男, 2: 女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            }else if("2".equals(gender)){
                emp.setGender("女");
            }

            //处理job - 1: 讲师, 2: 班主任 , 3: 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            }else if("2".equals(job)){
                emp.setJob("班主任");
            }else if("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}
View Code

Controller注入运行时所依赖的对象

package com.hiker.controller;

import com.hiker.dao.EmpDao;
import com.hiker.pojo.Emp;
import com.hiker.pojo.Result;
import com.hiker.service.EmpService;
import com.hiker.service.impl.EmpServiceA;
import com.hiker.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 {

    @Autowired // 运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
    private EmpService empService;

    @RequestMapping("/listEmp")
    public Result list(){
        //1. 调用service, 获取数据
        List<Emp> empList = empService.listEmp();

        //3. 响应数据
        return Result.success(empList);
    }

}
View Code

关于分层解耦思想的代码落地实现已经讲解完毕,下一篇我们详细讲解IOC控制反转以及DI依赖注入的细节。