pycharm 做网站哪个好,wordpress输出用户中心链接,洛阳市app网站开发公司电话,小米网络营销案例分析博客主页#xff1a;誓则盟约系列专栏#xff1a;Java Web关注博主#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出#xff0c;及时修改感谢大家点赞#x1f44d;收藏⭐评论✍ Java Web 三层架构#xff1a;
Java Web可以大致被分为三层架构#xff1a;…博客主页誓则盟约系列专栏Java Web关注博主后期持续更新系列文章如果有错误感谢请大家批评指出及时修改感谢大家点赞收藏⭐评论✍ Java Web 三层架构
Java Web可以大致被分为三层架构 controller控制层service业务逻辑层dao数据访问层 Controller层 controller层也称为控制层只要功能是接收前端发送的请求对请求进行处理并响应数据。 作为应用程序的入口点之一Controller 层负责接收来自客户端如浏览器、移动设备等的 HTTP 请求。这些请求可以是 GET、POST、PUT、DELETE 等不同类型的请求例如在 Web 应用中当用户在浏览器中输入一个 URL 或者提交一个表单时请求会被发送到相应的 Controller。 它会解析请求中的参数如查询字符串参数对于 GET 请求或者表单数据对于 POST 请求。例如在一个登录功能中Controller 会获取用户输入的用户名和密码参数。
注Controller 层并不直接实现业务逻辑而是调用 Service 层业务逻辑层的方法来处理业务。
Service层 service层也称为业务逻辑层在 Java 应用架构特别是遵循 MVC 或类似分层架构的应用中Service 层业务逻辑层扮演着核心的角色其中主要是处理具体的业务逻辑。 Service 层包含了应用的复杂且核心的业务逻辑。例如在一个银行系统中转账业务逻辑就会在 Service 层实现。它需要考虑诸如账户余额检查、转账金额的合法性、更新相关账户余额等操作。 除此之外Service通常还负责管理事务。在涉及多个数据库操作的业务场景中如订单处理包括创建订单、扣减库存、更新用户积分等多个数据库操作Service 层确保这些操作要么全部成功提交事务要么全部失败回滚事务。 在架构中Service 层为 Controller 层提供业务处理方法。Controller 层调用 Service 层的方法来完成具体的业务操作。
Dao层 Dao(Data Access Object)层也称为数据访问层主要负责数据访问操作包括数据的增删改查。 Dao 层的主要目的是将数据库操作抽象出来为上层通常是 Service 层提供统一的访问数据库的接口。这样上层业务逻辑层不需要关心具体的数据库类型如 MySQL、Oracle 等以及数据库的底层操作细节如 SQL 语句的编写、数据库连接的管理等。例如在一个企业级应用中无论是使用关系型数据库还是非关系型数据库Service 层只需要调用 Dao 层提供的方法如findUserById、saveUser等就可以实现对数据的操作。 除此之外Dao层还负责执行数据的持久化操作包括将数据保存到数据库插入操作、从数据库中查询数据、更新数据库中的数据以及删除数据库中的数据等操作。因此Dao层也被称为持久层。 分层解耦
首先要知道内聚和耦合两个概念
内聚软件中各个功能模块内部的功能联系。耦合衡量软件中各个层/模块之间的依赖、关联的程度。 在开发过程中我们要朝着高内聚低耦合的方向实施最好可以让层与层之间解除耦合让他们不产生依赖这样我们程序的灵活性和可扩展性会更佳。 下面我们以Spring框架为例讲解如何实现解耦操作。在 Spring 框架中解耦主要通过控制反转Inversion of ControlIOC和依赖注入Dependency InjectionDI的机制来实现。
控制反转IOC 在没有使用 Spring 等框架进行解耦之前对象之间的依赖关系通常是由对象自己创建和管理的。例如在一个业务逻辑类中如果需要调用数据访问层的方法来获取数据它可能会直接实例化数据访问层的对象。 public class BusinessLogicClass {public void doSomeBusinessLogic() {DataAccessClass dataAccess new DataAccessClass();// 使用 dataAccess 对象进行数据操作}} 这种方式存在的问题是业务逻辑类与数据访问类紧密耦合当数据访问层的实现发生变化时业务逻辑类也需要进行相应的修改。 而Spring 框架引入了控制反转的概念即对象的创建和依赖关系的管理不再由对象自己负责而是交给一个外部的容器通常是 Spring 容器来管理。而在IOC容器中创建、管理的对象称之为bean。 这样在 Spring 中对象只需要声明自己所需要的依赖而不需要关心这些依赖是如何创建和初始化的。例如 public class BusinessLogicClass {private DataAccessInterface dataAccess;public BusinessLogicClass(DataAccessInterface dataAccess) {this.dataAccess dataAccess;}public void doSomeBusinessLogic() {// 使用 dataAccess 对象进行数据操作}} 这里BusinessLogicClass不再自己创建DataAccessClass的实例而是通过构造函数接收一个实现了DataAccessInterface接口的对象。这样BusinessLogicClass只依赖于接口而不依赖于具体的实现类实现了解耦。
依赖注入DI 容器为应用程序提供运行时所依赖的资源称之为依赖注入。这些资源一般取自Spring容器中的bean对象。 Spring 框架通过依赖注入的方式来实现控制反转。依赖注入有多种方式常见的有构造函数注入、Setter 注入和字段注入。 构造函数注入在对象创建时通过构造函数将依赖对象传递进去。例如上面的例子中BusinessLogicClass通过构造函数接收DataAccessInterface的实现对象。 Setter 注入通过设置方法将依赖对象注入到对象中。 字段注入使用注解如Autowired直接在字段上进行依赖注入。例如 import org.springframework.beans.factory.annotation.Autowired;public class BusinessLogicClass {Autowiredprivate DataAccessInterface dataAccess;public void doSomeBusinessLogic() {// 使用 dataAccess 对象进行数据操作}}
解耦的好处
1.可维护性 由于对象之间的依赖关系通过接口进行解耦当一个模块的实现发生变化时只需要修改对应的实现类而不会影响到其他模块。例如如果数据访问层的实现从使用一种数据库切换到另一种数据库只需要修改数据访问层的实现类和 Spring 配置文件业务逻辑层不需要做任何修改。
2.可测试性 解耦后的代码更容易进行单元测试。在测试业务逻辑类时可以通过注入模拟的依赖对象如使用模拟框架创建的模拟数据访问对象来隔离其他模块的影响只专注于测试业务逻辑本身。
3.可扩展性 当需要添加新的功能模块时可以很容易地将新模块集成到系统中只需要在 Spring 配置文件中定义新模块的 bean并将其注入到需要的地方即可。例如添加一个新的业务逻辑模块只需要在配置文件中定义新的 bean并将其注入到现有的业务逻辑类中实现功能的扩展。 欲买桂花同载酒终不似、少年游。—— 《唐多令·芦叶满汀洲》