有哪些网站是可以做宣传的,WordPress中国市场规模,优化网站排名如何,环保网站建设开发文章目录 应用分层软件设计原则#xff1a;高内聚低耦合项目示例应用分层的好处企业规范 应用分层
应用分层是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的功能, 多个层次之间协同提供完整的功能
常见的MVC设计模式, 就是应用分层的一种具体体现… 文章目录 应用分层软件设计原则高内聚低耦合项目示例应用分层的好处企业规范 应用分层
应用分层是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的功能, 多个层次之间协同提供完整的功能
常见的MVC设计模式, 就是应用分层的一种具体体现 为什么需要应用分层? 一开始为了让项目快速上线我们通常是不考虑分层的。但是随着业务越来越复杂大量的代码混在一起会出现逻辑不清晰、各模块相互依赖、代码扩展性差、牵一发而动全身等问题。 如何分层 MVC 就是把系统分成了 Model模型 View视图和 Controller控制器三个层次也就是将用户视图和业务处理隔离开并且通过控制器连接起来很好地实现了表现和逻辑的解耦是一种标准的软件分层架构 目前主流的开发方式是 “前后端分离” 的方式, 后端开发工程师不再需要关注前端的实现, 所以对于Java后端开发者, 又有了一种新的分层架构: 把整体架构分为表现层、业务逻辑层和数据层。这种分层方式也称为三层架构
表现层: 是最靠近用户的一层,负责接收页面的请求给页面响应数据业务逻辑层: 负责处理业务逻辑数据层: 负责存储和管理与应用程序相关的数据,负责业务数据的维护操作包括增、删、改、查等操作
这三个部分, 在Spring的实现中, 均有体现:
Controller控制层。接收前端发送的请求对请求进行处理并响应数据。Service业务逻辑层。处理具体的业务逻辑。Dao数据访问层也称为持久层。负责数据访问操作包括数据的增、删、改、查 MVC 和 三层架构 的区别和联系 从概念上来讲, 二者都是软件工程领域中的架构模式.
MVC架构模式由三部分组成, 分别是: 模型(Model), 视图(View)和控制器(Controller)三层架构将业务应用划分为:表现层, 业务逻辑层, 数据访问层 MVC中, 视图和控制器合起来对应三层架构中的表现层模型对应三层架构中的业务逻辑层, 数据层以及实体类
二者其实是从不同角度对软件工程进行了抽象
MVC模式强调数据和视图分离, 将数据展示和数据处理分开, 通过控制器对两者进行组合三层架构强调不同维度数据处理的高内聚和低耦合, 将交互界面, 业务处理和数据库操作的逻辑分开
角度不同也就谈不上互相替代了在日常的开发中可以经常看到两种共存的情况但是二者的目的是相同的, 都是解耦分层代码复用
软件设计原则高内聚低耦合
高内聚实现某个功能的时候,如果和这个功能相关的代码是集中放在一起的,就认为是高内聚; 如果是散落在项目的各个文件,各个角落中就认为是低内聚。高内聚就非常方便找到并修改代码低耦合软件中各个层、模块之间的依赖关联越小越好。修改一处代码, 其他模块的代码改动越少越好
内聚和耦合并没有必然的联系
内聚描述的是模块内部的事情(也有可能是模块之间)耦合描述的是模块之间的事情 高内聚低耦合矛盾吗? 不矛盾, 高内聚指的是一个模块中各个元素之间的联系紧密程度, 低耦合指的是各个模块之间的紧密程度
这就好比一个企业, 包含很多部门, 各个部门之间的关联关系要尽可能的小, 一个部门发生问题, 要尽可能对降低对其他部门的影响, 这就是低耦合; 但是部门内部员工关系要尽量紧密遇到问题一起解决克服这叫做高内聚。又比如邻里邻居, 楼上漏水, 楼下遭殃, 就是高耦合一个家庭内部的关系越紧密越好一个家庭成员生病, 其他成员帮忙照顾, 就叫高内聚一个家庭尽可能减少对另一个家庭的影响,就是低耦合
项目示例 controller包下是控制层: 接收前端发送的请求对请求进行处理并响应数据
import com.example.messagewall.model.MessageInfo;
import com.example.messagewall.service.MessageInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.List;RequestMapping(/message)
RestController
public class MessageController {Autowiredprivate MessageInfoService messageInfoService;RequestMapping(value /publish, method RequestMethod.POST)public Boolean publish(RequestBody MessageInfo messageInfo) {//添加到数据库messageInfoService.insert(messageInfo);return true;}RequestMapping(/getList)public ListMessageInfo getList() {//从数据库查return messageInfoService.query();}
}service包下是业务逻辑层: 处理具体的业务逻辑
import com.example.messagewall.mapper.MessageInfoMapper;
import com.example.messagewall.model.MessageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;Service
public class MessageInfoService {Autowiredprivate MessageInfoMapper messageInfoMapper;public Integer insert(MessageInfo messageInfo) {return messageInfoMapper.insert(messageInfo);}public ListMessageInfo query() {return messageInfoMapper.query();}
}mapper包下是数据访问层: 负责数据访问操作包括数据的增、删、改、查
import com.example.messagewall.model.MessageInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;Mapper
public interface MessageInfoMapper {//添加留言Insert(insert into message_info (from,to, message) values (#{from}, #{to}, #{message}))Integer insert(MessageInfo messageInfo);//查询留言Select(select * from message_info where delete_flag0)ListMessageInfo query();
}model包下是实体类通常对应数据库中的表包含该事物的属性数据和行为方法是数据存储和业务逻辑的基础载体
import lombok.Data;Data
public class MessageInfo {private Integer id;private String from;private String to;private String message;private Integer deleteFlag;private String createTime;private String updateTime;
}前端messagewall.html代码:
!DOCTYPE html
html langenheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title留言板/titlestyle.container {width: 350px;height: 300px;margin: 0 auto;/* border: 1px black solid; */text-align: center;}.grey {color: grey;}.container .row {width: 350px;height: 40px;display: flex;justify-content: space-between;align-items: center;}.container .row input {width: 260px;height: 30px;}#submit {width: 350px;height: 40px;background-color: orange;color: white;border: none;margin: 10px;border-radius: 5px;font-size: 20px;}/style
/headbodydiv classcontainerh1留言板/h1p classgrey输入后点击提交, 会将信息显示下方空白处/pdiv classrowspan谁:/span input typetext name idfrom/divdiv classrowspan对谁:/span input typetext name idto/divdiv classrowspan说什么:/span input typetext name idsay/divinput typebutton value提交 idsubmit onclicksubmit()!-- divA 对 B 说: hello/div --/divscript srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js/scriptscript$.ajax({type: get,url: /message/getList,success: function(messages) {if(messages!null) {for(let message of messages) {var divE divmessage.from 对 message.to 说: message.message /div;$(.container).append(divE);}}}});function submit(){//1. 获取留言的内容var from $(#from).val();var to $(#to).val();var say $(#say).val();if (from || to || say ) {return;}//调用后端接口,发表留言$.ajax({type: post,url: /message/publish,contentType: application/json,data: JSON.stringify({from: from,to: to,message: say}),success: function(result) {if(result) {//成功//2. 构造节点var divE divfrom 对 to 说: say/div;//3. 把节点添加到页面上 $(.container).append(divE);//4. 清空输入框的值$(#from).val();$(#to).val();$(#say).val(); } else {//失败alert(发布失败);}}});}/script
/body/html配置文件application.yml:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncodingutf8useSSLfalseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration: # 配置打印 MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #配置驼峰自动转换
pom文件引入依赖部分: dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependency/dependencies按我配置的话MySQL建库建表语句是这样的:
CREATE DATABASE IF NOT EXISTS mybatis_test;USE mybatis_test;CREATE TABLE message_info (id INT AUTO_INCREMENT PRIMARY KEY COMMENT 消息ID,from VARCHAR(255) COMMENT 发送者,to VARCHAR(255) COMMENT 接收者,message VARCHAR(255) COMMENT 消息内容,delete_flag TINYINT DEFAULT 0 COMMENT 逻辑删除标志0有效1无效,create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间
);全部搞定之后访问http://127.0.0.1:8080/messagewall.html就能交互啦!
应用分层的好处
降低层与层之间的依赖, 结构更加明确, 利于各层逻辑的复用开发人员可以只关注整个结构中的其中某一层, 极大地降低了维护成本和维护时间可以很容易的用新的实现来替换原有层次的实现有利于标准化
企业规范
适用于多数企业, 均不做强制要求. 具体以所在企业为准
类名使用大驼峰风格但以下情形例外DO/BO/DTO/VO/AO方法名、参数名、成员变量、局部变量统一使用小驼峰风格包名统一使用小写点分隔符之间有且仅有一个自然语义的英语单词 常见命名风格介绍 大驼峰: 所有单词首字母都需要大写, 又叫帕斯卡命名法, 比如: UserController小驼峰除了第一个单词其他单词首字母大写比如: userController蛇形用下划线 (_) 作为单词间的分隔符一般小写又叫下划线命名法比如: user_controller串形用短横线 (-) 作为单词间的分隔符又叫脊柱命名法比如: user-controller 文章转载自: http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.nckzt.cn.gov.cn.nckzt.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.thpzn.cn.gov.cn.thpzn.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.qwhbk.cn.gov.cn.qwhbk.cn http://www.morning.syhwc.cn.gov.cn.syhwc.cn http://www.morning.xinxianzhi005.com.gov.cn.xinxianzhi005.com http://www.morning.gstg.cn.gov.cn.gstg.cn http://www.morning.qdmdp.cn.gov.cn.qdmdp.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.hqgkx.cn.gov.cn.hqgkx.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.gcspr.cn.gov.cn.gcspr.cn http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.lfdmf.cn.gov.cn.lfdmf.cn http://www.morning.rjynd.cn.gov.cn.rjynd.cn http://www.morning.kmprl.cn.gov.cn.kmprl.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.blfgh.cn.gov.cn.blfgh.cn http://www.morning.rzmzm.cn.gov.cn.rzmzm.cn http://www.morning.hsjfs.cn.gov.cn.hsjfs.cn http://www.morning.yhwyh.cn.gov.cn.yhwyh.cn http://www.morning.wzdjl.cn.gov.cn.wzdjl.cn http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn http://www.morning.xrnh.cn.gov.cn.xrnh.cn http://www.morning.krnzm.cn.gov.cn.krnzm.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.ylkkh.cn.gov.cn.ylkkh.cn http://www.morning.smszt.com.gov.cn.smszt.com http://www.morning.knqzd.cn.gov.cn.knqzd.cn http://www.morning.swkzr.cn.gov.cn.swkzr.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn http://www.morning.nkjkh.cn.gov.cn.nkjkh.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.phjyb.cn.gov.cn.phjyb.cn http://www.morning.cprls.cn.gov.cn.cprls.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.cgntj.cn.gov.cn.cgntj.cn http://www.morning.kgxrq.cn.gov.cn.kgxrq.cn http://www.morning.gqbtw.cn.gov.cn.gqbtw.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.pwghp.cn.gov.cn.pwghp.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.qgmwt.cn.gov.cn.qgmwt.cn http://www.morning.lczxm.cn.gov.cn.lczxm.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.ptslx.cn.gov.cn.ptslx.cn http://www.morning.lkkkf.cn.gov.cn.lkkkf.cn http://www.morning.mqbdb.cn.gov.cn.mqbdb.cn http://www.morning.lwtfx.cn.gov.cn.lwtfx.cn http://www.morning.gpnfg.cn.gov.cn.gpnfg.cn http://www.morning.znrlg.cn.gov.cn.znrlg.cn http://www.morning.mnsmb.cn.gov.cn.mnsmb.cn http://www.morning.ntzfl.cn.gov.cn.ntzfl.cn http://www.morning.rmxk.cn.gov.cn.rmxk.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.hbxnb.cn.gov.cn.hbxnb.cn http://www.morning.rythy.cn.gov.cn.rythy.cn http://www.morning.uytae.cn.gov.cn.uytae.cn http://www.morning.rfxw.cn.gov.cn.rfxw.cn http://www.morning.rnqyy.cn.gov.cn.rnqyy.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.wkjzt.cn.gov.cn.wkjzt.cn http://www.morning.qgwdc.cn.gov.cn.qgwdc.cn http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn