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; } }
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; } }
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); } }
关于分层解耦思想的代码落地实现已经讲解完毕,下一篇我们详细讲解IOC控制反转以及DI依赖注入的细节。