[Spring Boot] - 三层架构及控制反转
三层架构?
Controller : 控制层,接收前端发送的请求,对请求进行处理,并响应数据
Service : 业务逻辑层,处理具体的业务逻辑
Dao : 数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查
NOTE : 通过三层架构的分解, 有利于代码的维护和复用, 同时实现单一代码的单一职责原则, 示例如下:
Controller :
1 @RestController 2 public class EmpController { 3 private EmpService empService = new EmpServiceA(); 4 @RequestMapping("/listEmp") 5 public Result list() { 6 7 List<Emp> empList = empService.listEmp(); 8 return Result.success(empList); 9 } 10 }
Service :
1 public class EmpServiceA implements EmpService { 2 private EmpDao empDao = new EmpDaoA(); 3 @Override 4 public List<Emp> listEmp() { 5 6 List<Emp> empList = empDao.listEmp(); 7 empList.stream().forEach(emp -> { 8 ... 9 }); 10 return empList; 11 } 12 }
Dao :
1 public class EmpDaoA implements EmpDao { 2 @Override 3 public List<Emp> listEmp() { 4 String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); 5 System.out.println(file); 6 List<Emp> empList = XmlParserUtils.parse(file, Emp.class); 7 return empList; 8 } 9 }
What is 高内聚&低耦合?
传统软件设计的原则是高内聚低耦合, 所谓内聚, 即为软件中各个功能模块内部的功能联系, 而耦合则是衡量软件中各个层/模块之间的依赖、关联的程度. 当一个软件高耦合低内聚时, 带来的是软件复杂性的增加, 及维护成本的升高. 基于此, 控制反转的概念响应而生.
- 控制反转 : Inversion Of Control,简称IOC . 对象的创建控制权由程序自身转移到外部(容器), 这种思想称为控制反转
- 依赖注入 : Dependency Injection,简称DI . 容器为应用程序提供运行时,所依赖的资源 , 称之为依赖注入
- Bean对象 : IOC容器中创建、管理的对象 , 称之为Bean
Spring Boot中IoC的实现?
1. 将Service层 及 Dao层的实现类 , 交给IOC容器管理
@Component //将当前对象交给IOC容器管理,成为IOC容器的bean public class EmpDaoA implements EmpDao { @Override public List<Emp> listEmp() { String file = this.getClass().getClassLoader().getResource("emp.xml").getFile(); System.out.println(file); List<Emp> empList = XmlParserUtils.parse(file, Emp.class); return empList; } }
要把某个对象交给IOC容器管理, 需要在对应的类上加上如下注解:
- @Component : Inversion Of Control,简称IOC . 对象的创建控制权由程序自身转移到外部(容器), 这种思想称为控制反转
- @Controller : Dependency Injection,简称DI . 容器为应用程序提供运行时,所依赖的资源 , 称之为依赖注入
- @Service : IOC容器中创建、管理的对象 , 称之为Bean
- @Repository : @Component的衍生注解 , 标注在数据访问类上 , 由于与mybatis整合,现在用的比较少了
2. 为Controller及Service注入运行时 , 依赖的对象
1 @RestController 2 public class EmpController { 3 @Autowired 4 @Qualifier("empServiceA") 5 private EmpService empService ; 6 ... 7 }
要把某个对象交给IOC容器管理, 需要在对应的类上加上@Autowired注解,默认是按照类型进行,如果同类型的bean存在多个 , 可通过如下注解解决
- @Primary
- @Autowired + @Qualifier("bean的名称")
- @Resource(name="bean的名称")
3. 代码结构及运行结果参考 GitHub
本文作者:MounTain越山
本文链接:https://www.cnblogs.com/13mountain/p/17818100.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步