Spring Boot框架三层结构解耦

spring开发的web应用常使用三层架构,其目的在于解耦、提升可维护性和扩展性。

  1. controller层:接收前端发送的请求,处理之后返回响应数据。
  2. service层:具体的业务逻辑。
  3. dao层:数据访问,即Data Access Object,负责数据访问操作,如增删改查,经常需要与数据库交互。

数据流动和代码控制流的方向经常是,从前端发起,依次经过controller、service、dao,再反向传回前端。从代码实现的角度来说,通常是controller方法调用service层提供的业务逻辑代码处理请求数据,而service层的接口实现需要调用dao层提供的数据访问方法。

通常,service层和dao层的逻辑可能有多种实现,所以可以使用“接口定义+实现类”的方式,例如,在service包下定义接口,然后创建一个impl子目录,在其中编写接口的实现,在调用者方法中利用多态的方式调用接口实现。

如果使用下面的方式:

@RestController
public class Controller {private Service service = new ServiceA();// ...
}

那么当需要修改service层的代码时,例如使用新的ServiceB实现时,同时需要修改controller层的代码。这样就不符合解耦的需求。

spring框架的解决方案是提供一个外部容器,存储所有对应的对象,当程序需要使用某一对象时,从容器中获取对应的对象。对此spring框架使用的技术叫做IoC和DI。

  • IoC即Inversion of Control,控制反转,是指对象的创建控制由程序自身转移到外部(即IoC容器)。
  • DI即Dependency Injection,依赖注入,是指容器为应用程序提供运行时所依赖的资源。
  • 还有一个概念叫做bean对象,IoC容器中创建和管理的对象叫bean对象。

IoC和DI的基本步骤总结如下:

  1. service层和dao层的实现类,交给IoC容器管理。这一步需要在实现类上加入@Component注解。
  2. 为controller和service注入运行时依赖的对象。这一步需要在对象声明时加入@Autowired注解。

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

  1. @Component,这个是基础注解,加上该注解就是把该类的对象声明为bean类。通常鼓励使用更准确的衍生注解,所以这个注解的典型应用是工具类。
  2. @Controller,是衍生的注解,标注在controller类上。@RestController已经包含了这个注解。
  3. @Service,同样,标注在业务逻辑类上。
  4. @Repository,同样,标注在dao类上,由于会与mybatis整合起来,所以用的比较少。

也就是说代码的形式可能如下,以service层为例,dao层类似:

// controller
@RestController
public class Controller {@Autowiredprivate Service service;// 方法直接调用service
}// service
public interface Service {// 接口定义
}// service impl
@Service
public class ServiceA implements Service {// 接口实现
}

注意,这四个注解需要生效还需要能够被组件扫描注解@ComponentScan扫描到。由于启动类声明注解@SpringBootApplication中默认扫描的范围是启动类所在包及其子包,所以如果你的组件不在这个包中,又希望它能被IoC容器管理,就需要显式声明组件扫描注解。spring boot的推荐做法是将所以代码放在启动类所在包及其子包下。

bean类型依赖注入使用的@Autowired注解默认按照类型进行,那么如果IoC容器中存在多个相同类型的bean,就会在启动时报错。有三个解决方案:

  1. @Primary注解,表明优先使用该实现类,想要使用哪个实现类,就将它加在该类上。
  2. @Qualifier注解,按照类型注入,指明需要注入的是哪个bean对象。
  3. @Resource注解,按照名称注入,知名需要注入哪个bean对象。该注解是jdk提供的,前面的注解则是spring框架提供的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879781.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《高效能人士的七个习惯》

情感账户 勇气和体谅 大石头 自传式回应、同理心倾听:用你的话反映他们的感受和意思,而不是去评论、去判断是否正确

高效能人士的七个习惯

情感账户 勇气和体谅 大石头 自传式回应、同理心倾听:用你的话反映他们的感受和意思,而不是去评论、去判断是否正确

新春“码”启 | Cocos 3D 微信小游戏(第5天):分包构建和上传发布(完美收官)

新春开发 Cocos 3D 微信小游戏计划的第 5 天,详细介绍了如何利用Cocos Creator开发并发布一款3D微信小游戏,包括游戏状态机的设计理念,和微信小游戏主包大小限制时的解决方案——分包策略。从游戏设计、开发、调试到最后成功发布的全过程,为想要进入微信小游戏开发领域的开…

爬虫随笔(一)

爬虫随笔,某牛前几天一直在看js逆向,现在分享一下本人近期学习记录首先分享一个网站,这个网站可以获得request所需要的header和cookie https://curlconverter.com/ 爬取网站就不挂了简单观察发现,该网站是滑动加载,我们可以在滑动加载时获得我们所需要的接口,发现两个链…

Flow-CLI 全新升级,轻松对接 Sonar 实现代码扫描和红线卡点

Flow-CLI 使用的典型场景如:自定义开发一个 Sonar 扫描步骤,以在流水中触发 Sonar 扫描,并以扫描结果作为红线卡点,以保证代码质量;对接三方自有审批平台,在发布前进行检查审批,审批通过才允许发布。场景介绍 Flow-CLI 是云效流水线 Flow 推出的一款命令行工具,帮助用户…

皮克定理

小蓝鸟的面积S=B/2+I-1

两步构建 AI 总结助手,实现智能文档摘要

本次解决方案将向您介绍,如何通过函数计算 FC 阿里云百炼平台搭建智能 AI 总结助手,实现高效的文本自动总结和信息提取。在信息极度丰富的当下,如何从海量且复杂的文件资料中筛选出关键内容,成为了不少企业和个人急需解决的问题。本次解决方案将向您介绍,如何通过函数计算…

自定义桌面——获取天气

最近天气时不时会降温,经常用手机查看天气,感觉好不方便,今天决定把天气的功能添加到“自定义桌面”来,为了免费获取天气数据,竟然花了差不多一天的时间来制作完成。(假如一天人工费几百来算,这样真的值得吗?非常值得!为未来完善功能添砖加瓦打好基础!) 添加天气的功…

2.6 第三张评估表搭建

今天完成了作业中第三张能力评估表的搭建 html界面(部分)如下:以下是前端代码(部分): <body> <h1 style="text-align: center">能力评估</h1> <div id="root" style="border: 1px solid black"><form id="…

V-Control 开箱即用的.NET MAUI组件库发布了!

之前写过挺多的MAUI Sample,其中有很多代码可以打包成组件,当组件完善到一定程度,我会把控件封装起来放到控件库中。 今天,在这个仓库建立一年零八个月后,我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET MAUI,犹豫是否可以拿来作为有生产力的跨平台移动端开发…

国产直升机发展现状及思考

​由于独特的自然环境条件以及当前经济社会发展情况,比较世界上其他发达国家,直升机早已渗入中国城乡建设与经济社会活动的各个环节,例如农林工作、地质勘探、旅游观光、飞机驾驶训练等,直升机对国民经济工程建设起到了重要的作用。 按照我国航空工业技术研究机构的预计,截…

做题随笔:P10451

Solution 题意 原题链接 定义二元关系 \(\text{S}\),其满足反对称性且不满足传递性。 现有互异元素 \(N(N \le 1000)\) 个,可以进行不多于 \(10000\) 次提问,每次提问可以得知两指定元素 \(a,b\) 的 \(a \, \text{S} \, b\) 结果。求序列 \(a_N\) 满足:对任意 \(x_i,x_{i+1…