P75分层解耦-IOC&DI详解

一、分层解耦-三层架构

image-20230419213427158

image-20230419213600890

image-20230419220816149

image-20230419221507218

Dao层:数据访问

1、接口

package com.itheima.dao;

import com.itheima.pojo.Emp;

import java.util.List;

/**
 * Description:
 * date: 2023/4/19 21:42
 *
 * @since JDK 11
 */
public interface EmpDao {
	public List<Emp> listEmp();
}

2、实现类

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 org.springframework.stereotype.Repository;

import java.util.List;


//控制反转
//@Component  //将当前类交给IOC容器管理,成为IOC容器中的bean
@Repository
public class EmpDaoA implements EmpDao{
	@Override
	public List<Emp> listEmp() {
		//		1、加载并解析emp.xml
//		    动态加载文件路径。切记不能模块路径不能带空格!!!不能有中文
		String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
		List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
		return empList;
	}
}

Service层:逻辑处理

1、接口

package com.itheima.service;

import com.itheima.pojo.Emp;

import java.util.List;

/**
 * Description:
 * date: 2023/4/19 21:47
 *
 * @since JDK 11
 */
public interface EmpService {
// 获取员工列表数据
   public List<Emp> listEmp();
}

2、实现类

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 java.util.List;

/**
 * Description:
 * date: 2023/4/19 21:49
 *
 * @since JDK 11
 */
public class EmpServiceA implements EmpService {
// 创建一个Dao对象,面向接口。
   private EmpDao empDao = new EmpDaoA();

   public List<Emp> listEmp(){
//    1、调用Dao获取数据
      List<Emp> empList = empDao.listEmp();

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

//       处理job 1代表讲师、2代表班主任、3代表就业指导
         String job = emp.getJob();
         if(job.equals("1")){
            emp.setJob("讲师");
         }
         if(job.equals("2")){
            emp.setJob("班主任");
         }
         if(job.equals("3")){
            emp.setJob("就业指导");
         }
      });
      return empList;
   }
}

controller层:接收请求,响应数据

1、代码

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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Description:
 * date: 2023/4/19 20:03
 *
 * @since JDK 11
 */
@RestController
public class EmpController {
// 定义面向接口的对象
   private EmpService empService = new EmpServiceA();

   @RequestMapping("/listEmp")
   public Result listEmp() {

//     1、调用service,获取数据
      List<Emp> empList = empService.listEmp();
//    2、响应数据
      return Result.success(empList);
   }



      /*//      1、加载并解析emp.xml
//        动态加载文件路径。切记不能模块路径不能带空格!!!不能有中文
      String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
//    String file = "D:/intellij java/itheima_web_project/springboot-web-req-resp/src/main/resources/emp.xml";
      List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
//    2、对数据进行转换处理
      empList.stream().forEach(emp ->{
//       处理gender  1代表男性、2代表女性
         String gender = emp.getGender();
         if(gender.equals("1")){
            emp.setGender("男");
         }else {
            emp.setGender("女");
         }

//       处理job 1代表讲师、2代表班主任、3代表就业指导
         String job = emp.getJob();
         if(job.equals("1")){
            emp.setJob("讲师");
         }
         if(job.equals("2")){
            emp.setJob("班主任");
         }
         if(job.equals("3")){
            emp.setJob("就业指导");
         }
      });*/

}

二、分层解耦

在这里插入图片描述

image-20230420204616762

image-20230420205510076

三、IOC & DI入门

image-20230420210805638

image-20230420210833857

image-20230420210901215

image-20230420211014422

image-20230420211021038

image-20230420211026942

将service的实现类A的注解@Component注释掉

image-20230420211441223

新建一个实现类B,添加注解@Compentent

这样就切换为实现类B了

image-20230420211733495

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfuPr7l4-1682001792346)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20230420211746353.png)]

四、IOC详解

image-20230420212230211

image-20230420214215443

image-20230420214223601

image-20230420214331081

image-20230420214801755

image-20230420215606381

小结

image-20230420215637596

五、DI详解

image-20230420220750469

@Autowired默认是按照类型进行自动装配的,如果存在多个相同类型的bean,就会出错,我们需要调整bean的优先级

image-20230420221723036

image-20230420221913408

image-20230420221921085

在EmpServiceB.java添加了注解@Primary,在Controller中注入的就是EmpServiceB

image-20230420222316547

在EmpController中添加了注解@Qualifier

image-20230420223404619

image-20230420223345618

在EmpController中添加了注解@Resource

image-20230420223606672

小结

image-20230420223628566

注意bean的名称是类名,第一个字母小写
@Resource和@AutoWired的区别(面试题)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值