SpringBoot - IOC&DI

三层架构

  • controller:控制层,接收前端请求,对请求进行处理,并响应数据
  • service:业务逻辑层,处理具体的业务逻辑
  • dao:数据访问层(Data Access Object)(持久层),负责访问操作,包括数据得增删改查

员工案例重构:

controller:


package com.chuangzhou.controller;

import com.chuangzhou.pojo.Emp;
import com.chuangzhou.pojo.Result;
import com.chuangzhou.service.EmpService;
import com.chuangzhou.service.impl.EmpServiceImplA;
import com.chuangzhou.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {

    private EmpService empService = new EmpServiceImplA();

    @RequestMapping("/listEmp")
    public Result listEmp(){
        List<Emp> emps = empService.empList();
        return Result.success(emps);
    }
}

service:

package com.chuangzhou.service.impl;

import com.chuangzhou.dao.EmpDao;
import com.chuangzhou.dao.impl.EmpDaoImplA;
import com.chuangzhou.pojo.Emp;
import com.chuangzhou.service.EmpService;

import java.util.List;

public class EmpServiceImplA implements EmpService {

    private EmpDao empDao = new EmpDaoImplA();

    @Override
    public List<Emp> empList() {
        List<Emp> emps = empDao.empList();

        emps.stream().forEach(emp -> {
            String gender = emp.getGender();
            if ("1".equals(gender)){
                emp.setGender("男");
            }else if("2".equals(gender)){
                emp.setGender("女");
            }
            //         <!-- 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 emps;
    }
}

dao 层:

package com.chuangzhou.dao.impl;

import com.chuangzhou.dao.EmpDao;
import com.chuangzhou.pojo.Emp;
import com.chuangzhou.utils.XmlParserUtils;

import java.util.List;

public class EmpDaoImplA implements EmpDao {
    @Override
    public List<Emp> empList() {
        String filePath = this.getClass().getClassLoader().getResource("emp.xml").getPath();
        List<Emp> emps = XmlParserUtils.parse(filePath, Emp.class);
        return emps;
    }
}

分层解耦

  • 软件设计原则:高内聚低耦合
  • 内聚:软件中各个功能模块内部的功能联系
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度

controller 依赖 service,service 实现类一旦发生变化就需要改controller层代码:

如何实现解耦?

IOC & DI 入门

@Component
public class EmpServiceImplA implements EmpService {

    @Autowired
    private EmpDao empDao;

@Component:将标注类的创建权限交给Spring 容器
@Autowired: 注入一个被标记的类的对象

IOC 详解

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注意事项:

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能使用@Controller

IDEA中可以查看到Spring容器中创建的对象:

指定声明bean时的名称:

组件扫描

将dao层的包移动到启动类所属包的外面,启动程序的时候将会报错:

默认的@SpringBootApplication 注解包含了@ComponentScan,但是只会扫描启动类所属的包及其子包

如果要扫描其他包需要显示的声明,参数为一个String数组:

@SpringBootApplication
@ComponentScan({"dao","com.chuangzhou"})
public class SpringbootWebQuickstartApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebQuickstartApplication.class, args);
    }

}

DI 详解

@Autowired 注解默认是按照类型进行装配

那么当注入时如果存在多个接口的子类,就会产生不知道注入哪个实列

此时可以在想要注入的类上加入注解@Primary

还可以通过@Resource 和 @Qualifier 注解来解决

    //方式一:
    @Autowired
    @Qualifier("empServiceImplA")
    private EmpService empService;
        
    //方式二:
//    @Resource(name="empServiceImplA")
//    private EmpService empService;

需要注意的是:

posted @   chuangzhou  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-08-06 Kubernetes(二) - 入门实战
2022-08-06 Kubernetes(三) - Pod详解
点击右上角即可分享
微信分享提示