文章目录
刚开始接触 java 的时候各种晕头转向,很多概念都不知道,代码写起来很头大,略略总结近期接触到的各种概念。毕竟好记性不如烂笔头
1. Spring 相关
1.1 Spring 是什么
Spring 是一个开源框架, Spring 是 2003 年兴起的一个轻量级 java 开发框架。框架的主要优势是分层架构,其允许使用者选择使用哪一个组件,Spring 的核心是控制反转 (IOC)和 面向切面编程(AOP),划重点:
- 轻量级:与 EJB 相比,依赖资源少,销毁资源少
- 分层:一站式,每一层都提供解决方案 ,包括(web 层、service 层、dao 层)
1.2 Spring 核心理解
1.2.1 IOC
IOC 控制反转,原本需要自行创建和维护的 bean(可以理解为各种类) 交给 Spring 管理。控制反转的一种途径是通过依赖注入。
DI 依赖注入,Spring 按照配置规则(注解 or xml 文件)将依赖的内容注入给指定的 bean
1.2.2 AOP
AOP 面向切面,在调用对象的某个方法时,执行插入的切面逻辑。实现的方式
- 动态代理也叫运行时增强,比如jdk代理 (接口 + 实现类)、CGLIB(实现类,字节码增强)
- 静态代理是在编译时进行织入或类加载时进行织入,比如 AspectJ。
AOP 采取横向抽取机制,来取代纵向继承体系的重复代码。
经典应用:事务管理,性能监控,缓存,日志,安全检查等
1.3 如何新建一个 Spring 项目
好奇宝宝体质,研究了下如何基于 idea 创建一个 spring service 服务
1.3.1 步骤 1
点击:File -> New -> Project 然后按照下图创建项目
1.3.2 步骤 2
1.3.3 步骤 3
注意:此处有坑,请确认 {user_directory}.m2/ *.xml 配置的镜像地址可用,以下配置可用,亲测有效!
/?/?/.m2/repository
要修改为正确的路径
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 默认的值是${user.home}/.m2/repository -->
<!-- 此处请输入正确的地址!!!-->
<localRepository>/?/?/.m2/repository</localRepository>
<!-- 如果Maven要试图与用户交互来得到输入就设置为true,否则就设置为false,默认为true。 -->
<interactiveMode>true</interactiveMode>
<!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false。 -->
<usePluginRegistry>false</usePluginRegistry>
<!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。 如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 -->
<offline>false</offline>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<!-- settings.xml中的profile是pom.xml中的profile的简洁形式。 它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。
profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。 如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。 -->
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Milestone Repository</name>
<url>http://repo.spring.io/milestone</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
<repository>
<id>spring-snapshot</id>
<name>Spring Snapshot Repository</name>
<url>http://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
<!-- activations是profile的关键,就像POM中的profiles,profile的能力在于它在特定情况下可以修改一些值。
而这些情况是通过activation来指定的。 -->
<!-- <activeProfiles/> -->
</settings>
1.3.4 没有 src 目录怎么解决?
请用力戳这里 -> idea新建maven项目没有src目录的操作方法
1.3.5 没有 resouces 目录怎么解决?
请用力戳这里 -> intelliJ idea新建maven项目没有resource文件夹
1.3.6 创建成功
1.3.7 增加 spring 依赖 & 写个例子呗
在 pom.xml 文件增加
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
🌰🌰🌰 代码戳这里
2. 分层领域模型
了解下 spring 在服务器开发中所处的位置,其中也包含了其他主流的框架在服务器开发的所处位置:
2.1 论正确分层的重要性
2.1.1 分层概述
阿里的编程规范中约束的分层如下:
-
终端显示层:各个端的模板渲染并执行显示的层。包括 JS 渲染,移动端展示等。
-
开放接口层:
- 封装 service 方法暴露成 RPC 接口
- Web 封装成 http 接口
进行网关安全控制、流量控制等。
-
Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
-
Service 层:相对具体的业务逻辑服务层。
-
Manager 层:通用业务处理层
- 对第三方平台进行封装的层,预处理返回结果及转化的异常信息
- 对 Service 层通用能力的下沉,如缓存方案,中间件处理
- 与 DAO 层交互,对多个 DAO 的组合复用
-
DAO 层:数据访问层,与底层 MySQL、Hbase 进行数据交互
2.1.2 请慎重选择分层
在经历加一个接口要改 30 个文件的「刻骨铭心」的记忆以后,我开始思考,真的需要这么多层嘛?
「分层一时爽,写起来火葬场」为了能过契合上面的分层模型,定义了太多没有实际使用价值的类,写起来不仅繁琐,简直阻碍了我对 java 这门语言的热爱,这么美好的人生全部都浪费在定义类上,我想说「人间不值得」……
你以为我会说怎么正确的分层嘛?不,我不会,毕竟作为 java 小白选手,还是很有自知之明的,不过个人觉得分层这种东西,还是要「分场景」处理的,不能一概而论,要根据自己业务做合适的调整。
「别人给的都是建议,请自己做选择」(ps 毒鸡汤上线
2.2 各种概念
港真,概念真没什么好说的,自己看看就知道是什么意思了,但是知道这些概念能够让你快速上手新项目(ps 不要问我怎么知道的……
分层领域模型规约:
- VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象
- DTO (Data Transfer Object):数据传输对象,Service 向外传输的对象
- DO (Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体
- DO(Data Object)/PO(Presistent Object):持久化对象,它跟持久层的数据结构形成一一对应的映射对应的映射关系
- BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象
- AO(Application Object):应用对象,在 web 层与 service 层之间抽象的复用对象模型
- POJO(Plain Ordinary Java Object):POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO 等。
领域模型命名规范:
- 数据对象:xxxDO,xxx 即为数据表名
- 数据传输对象:xxxDTO,xxx 为业务领域相关对的名称
- 展示对象:xxxVO,xxx 一般为网页名称
- 禁止命名成 xxxPOJO
本来打算把图解上面的内容都写好的,但是为了更好的阅读体验还是分为上下两个步骤比较合适,比较太长的文章读起来往往让人昏昏欲睡