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;
需要注意的是:
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/17609193.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-08-06 Kubernetes(二) - 入门实战
2022-08-06 Kubernetes(三) - Pod详解