相关导航
Spring系列一品境之金刚境
Spring金刚境导航
- Spring系列复习(一)
- 前言
- 一、Spring全家桶学习路线
- 1、 思维导图
- 二、系列基础概念梳理
- 1、Spring
- 1.1 Bean
- 1.2 Injection(注入)
- 1.3 DI(依赖注入)
- 1.4 Spring ApplicationContext(应用上下文)
- 1.4.1 IOC容器
- 1.4.2 IOC容器类别
- 1)Spring BeanFactory容器
- 2)Spring ApplicationContext容器
- 1.5 AOP(面向切面编程)
- 1.6 Wire(装配)
- 1.7 Annotion(注解)
- 1.8 Servlet
- 1.9 微服务
- 1.9.1 微服务设计原则
- 1)单一职责原则
- 2)服务自治原则
- 3)轻量级通信原则
- 4)接口明确原则
- 1.10 Cloud Native(云原生)
- 三、SpringMVC(略)
- 四、SpringBoot
- 1、定义
- 2、特性
- 3、项目框架
- 3.1 基础框架
- 3.1.1 启动类格式
- 3.2 解耦模块框架
- 3.2.1 Maven中pom.xml文件解析
- 1)Maven内置属性
- 2)POM属性
- 3.2.2 Maven的parent属性
- 3.2.3 Spring Boot层级介绍与使用
- 1)Controller层
- 2)Service层
- 3)Mapper层
- 4)VO层
- 5)Entity层
- 4、配置文件
- 4.1 application.yaml文件
- 4.1.1 参数详解
- 4.2 application.properties
- 5、各层常用注解
- 5.1 启动层
- 5.1.1 @SpringBootApplication
- 5.1.2 @SpringBootConfiguration
- 5.1.3 @EnableAutoConfiguration
- 5.1.4 @ComponentScan
- 5.2 Controller层
- 5.2.1 @Controller
- 5.2.2 @RestController
- 5.2.3 @RequestBody
- 5.2.4 @RequestMapping
- 5.2.5 @GetMapping
- 5.2.6 @PostMapping
- 5.2.7 @PathVariable
- 5.2.8 @RequestParam
- 5.2.9 @RequestHeader
- 5.2.10 @CookieValue
- 5.3 注入Bean
- 5.3.1 @Autowired
- 5.3.2 @Component
- 5.3.3 @Bean
- 5.3.4 @Bean产生一个bean的方法
- 5.3.5 @Scope
- 5.4 Service层
- 5.4.1 @Service
- 5.5 Entity层
- 5.5.1 @Entity
- 5.6 配置文件导入
- 5.6.1 @PropertySource
- 5.6.2 @ImportResource
- 5.6.3 @Import
- 5.7 全局异常处理
- 5.7.1 @ControllerAdvice
- 5.7.2 @ExceptionHandler
- 5.8 事务注解
前言
本博文重在夯实Spring全家桶的知识点,回归书本,夯实基础,学深学精
Java相关基础已复习完毕,现在就到了Spring全家桶系列了,欲练神功,先固内功。之前做项目对Spring全家桶学的一知半解,好多基础概念都不清楚,正好借此机会梳理一下相关知识点。
参考书籍:《Spring In Action 5th EDITION》与《多线程与高并发 马士兵丛书》
本博文主要归纳整理Spring全家桶的一系列概念、其AOP和IOC原理和常见注解。
- Spring是一个开源的轻量级的Java开发框架,其中包括SpringMVC、SpringBoot、SpringCloud、SpringSecurity、反应式编程。
- Bean是计算机自动生成的类,Bean是一个由Spring IOC容器实例化、组装和管理的对象
- Bean并不是程序员编辑的,而是程序运行时,由Spring通过反射生成的
- Spring通过依赖注入的方式来管理Bean之间的依赖关系
- Spring注入可以理解为是对一个对象进行初始化,也就是省去new的这个步骤
- 如果遇到修改,只需要改一处就行了。
- Dependency Injection,是IOC的另一个名字,自动满足Bean之间的依赖
- 是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性
- 创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入
- 又称之为容器(container)
- 负责对象整个生命周期的管理(创建、装配、销毁)
- 可以简单理解为工厂,负责造对象的
- 利用IOC设计思想,Spring的核心之一
注:Spring的设计模式是工厂模式
1.4.1 IOC容器- 全称是 Inversion Of Control,是一种设计思想,控制反转
- 开发者不需自己主动创建对象和管理对象之间的依赖关系,即将控制权交给IOC容器,负责对象的创建、管理和销毁
- 简单来说,对象需要的时候,就自动地生成对象,不用再去创建
- 要容器造什么对象、对象之间有什么依赖关系是由开发者自己决定的,自动满足Bean之间的依赖
- 最简单的容器,给DI提供了基本的支持
- 移动设备中为了节省有限的资源,会被优先选择,即主要用于轻量级应用
- 包 org.springframework.beans.factory.BeanFactory
- 在Spring BeanFactory容器的基础上,添加了更多企业特定的功能,也就是比BeanFactory更加优秀更加牛逼了。
- 包 org.springframework.context.ApplicationContext
- Aspect Oriented Programming,面向切面编程
- 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
- 是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
- 对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低
- Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
- Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
- Target(目标对象):织入 Advice 的目标对象.。
- Weaving(织入):将Aspect和其他对象连接起来, 并创建 Adviced object 的过程
- 一种是将Bean和属性进行对应,即将属性装配在Bean中
- 一种是IOC/DI,就是控制反转/依赖注入,自动满足Bean之间的依赖
- 注解(Annotation)为Java代码提供元数据
- 注解的属性也叫做成员变量。注解只有成员变量,没有方法
- 想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去的一张标签
- 详情请戳这个博客
- Server Applet,服务程序
- 运行在服务器上的一个小程序,用来处理服务器请求的
- 微服务是针对与单体架构而言的,是项目开发的一种架构
- 微服务得从两个方面去理解,什么是"微"、什么是"服务"
- 微,狭义来讲就是体积小,所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
- 微服务的目的是有效的拆分应用,实现敏捷开发和部署,使各种服务淞耦合
- 对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
- 不适合业务非常底层的系统,如操作系统内核、存储系统、数据库系统等
每个微服务只需要实现自己的业务逻辑就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。
2)服务自治原则每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。
3)轻量级通信原则首先是通信的语言非常的轻量,第二,该通信方式需要是跨语言、跨平台的,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。
4)接口明确原则由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活,从而尽量避免其它模块也做调整。
1.10 Cloud Native(云原生)- 应用原生被设计在云上以最佳方式运行,充分发挥云的优势
- 云原生代表着原生为云设计 ,即充分利用云资源,以云上运行为最佳目标设计应用
- 云的出现,可以在提供各种资源之外,还提供各种能力,从而帮助应用,使得应用可以专注于业务需求的实现
- 非业务需求相关的功能都被移到云,或者说基础设施中去了,以及下沉到基础设施的中间件
- 像虚拟化、弹性扩展、高可用、高容错性、自恢复这些都是云的基本属性,云原生作为一种云计算,这是所具备的第一层含义
- SpringMVC解决了V与C的交互问题,M是Model,V是View,C是Controller,是MCV架构
- 在SpringMVC中,只使用了1个DispatcherServlet去接收所有的请求,然后进行分发到不同的Controller中的某个方法,从而,减少Servlet对象的数量
- 主要是通过接收分发请求减少Servlet对象的数量
Spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动Spring项目。
2、特性- 快速开发Spring应用的框架
- 内嵌Tomcat和 Jetty 容器,不需要单独安装容器,使用main方法就可以直接启动发布一个 Web应用
- 简化 Maven 配置,通过继承parent构件 ,一站式引入需要的各种依赖(启动器),简化依赖管理【优化混乱的管理】
- 通过约定大约配置的方式可以实现基于注解的零配置思想【优化复杂的配置】
- 和各种流行框架, Spring MVC , Mybatis , Spring Cloud 无缝整合
- ① 直接用IDEA新建SpringBoot项目会默认生成的一些文件,根据个人查的资料是对于项目本身没用的,可以删除。
- ②自动生成的SpringBoot启动类。
- ③自动生成的SpringBoot项目配置文件(或者是.yml文件格式),默认是空的,什么内容也没有,可以根据项目需求自行添加。
- ④自动生成的项目test目录,写测试类时会用到。
- ⑤项目的pom.xml文件,用来管理项目所有依赖。【进阶:可以利用parent来管理依赖】
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
import java.util.TimeZone;
@SpringBootApplication //启动类注解
public class AdminApplication { //启动类
public static void main(String[] args) { //main方法
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(AdminApplication.class, args); //启动操作
}
}
注:Spring Boot一般通过Maven构建工具管理项目,体现在pom.xml文件
3.2 解耦模块框架以蘑菇博客为例,主要借助Maven的parent功能解耦。
3.2.1 Maven中pom.xml文件解析- Maven基本信息
4.0.0 //声明项目描述符遵循哪一个POM模型版本。 //模型本身的版本很少改变,虽然如此,但它仍然是必不可少的, //这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。com.funtl //公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, //如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/tradeitoken-dependencies //本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的1.0.0 //本项目目前所处的版本号war //打包类型,可取值:pom , jar , maven-plugin , ejb , war , ear , rar , par等等itoken dependencies //项目的名称, Maven产生的文档用,可省略www.funtl.com //项目主页的URL, Maven产生的文档用 ,可省略
- 依赖关系
... sample.ProjectB //同上Project-B //同上1.0 //同上compile true
注意
相对于,所有声明在 里的依赖都会自动引入,并默认被所有的子项目继承。
里只是声明依赖,并不实现引入。
- 继承关系
通过实现
----父项目[...] ----子项目 [...][...] junit junit 4.4 test [...] relativePath默认为…/pom.xml,如果路径不一样需要手动指定 com.devzuz.mvnbook.proficio proficio 1.0-SNAPSHOT ../ParentProject/pom.xml
- 聚合关系 用于将多个maven项目聚合为一个大的项目
通过实现
1)Maven内置属性4.0.0 com.park.mvnDemo.account account-aggregator 1.0.0-SNAPSHOT pom Account Aggregator account-email account-persist
- ${basedir} 项目的根目录(包含pom.xml文件的目录)
- ${version} 项目版本
- ${project.build.sourceDirectory} 项目的主源码目录,默认为 src/main/java
- ${project.build.testSourceDirectory} 项目的测试源码目录,默认为 src/test/java
- ${project.build.directory} 项目构件输出目录,默认为 target/
- ${project.outputDirectory}项目主代码编译输出目录,默认为 target/classes/
- ${project.testOutputDirectory} 项目测试代码编译输出目录,默认为 target/test-classes/
- ${project.groupId} 项目的 groupId
- ${project.artifactId} 项目的 artifactId
- ${project.version} 项目的 version,与${version}等价
- ${project.build.fianlName} 项目打包输出文件的名称默认为"${project.artifactId}
${project.version}"
可以分成多个目录进行解耦开发
-
主要可以分为基础功能模块、工具组件、管理端、客户端、辅助功能模块。
-
由于Maven的多模块聚合结构,父模块的
记录着所有的子模块 -
在每一个子模块中也都标明了自己的父模块的配置信息
-
父模块的
中记录了子模块的artifactId,子模块中 也记录着父模块的配置信息 -
子模块中
中的 中记录的是父项目相对于子项目的路径。这样的逻辑是,在构建子项目的时候首先根据相对路径找到父项目
子模块可以继承父模块的元素
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心元素
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- contributors:项目的贡献者信息
- distributionManagement:项目的部署信息
- issueManagement:项目的缺陷跟踪系统信息
- ciManagement:项目的持续集成系统信息
- scm:项目的版本控制系统信息
- mailingLists:项目的邮件列表信息
- properties:项目的依赖配置
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositories:项目的仓库配置
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
- reporting:包括项目的报告输出目录配置、报告插件配置等
3.2.3 Spring Boot层级介绍与使用org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE mogu_utils mogu_base mogu_xo mogu_admin mogu_web mogu_picture mogu_sms mogu_search mogu_monitor mogu_gateway mogu_zipkin mogu_spider mogu_commons
一般的项目模块中都有Entity、Mapper、VO、Service、Controller层。
其关系如下
其中,这张图还少个Entity层,是在Mapper层下面。
- 控制请求和响应,负责前后端交互,分发请求
- Controller层主要调用Service层里面的接口实现控制具体的业务流程
- 控制的配置也要在配置文件(yml或者properties文件)中进行
- 业务逻辑层,主要进行业务逻辑的具体实现
- 分为两种类,一个是Service接口类,是具体逻辑的接口
- 一个是ServiceImpl类,是对Service接口的实现类,实现接口中的具体方法
- Service的Impl(实现类)是把Mapper和Service进行整合的文件
- 又称DAO层,是数据持久化层,简单理解为对数据库进行增删改查操作
- 和Service层相同,分为两种类,一种是Mapper接口类,主要是数据库操作的接口
- 另一种是MapperImpl即接口实现类,但Mybatis使用Java动态代理接口,不需要实现类,直接通过Mapper.XML文件进行配置实现类
- Object值对象
- 用于业务层之间的数据传递,仅仅包含数据
- 将前端的需要的数据做一个整合,打包成一个类,方便前端获取数据
- 类中属性可以和数据库表中字段相同,也可以不同
- 称为实体层,和数据库中表进行映射与对应
- 只有一个Entity类,有getter和setter方法
Entity书写规范
1.java中包和类的建立和书写:
包名可以自己定义,但最好是全部小写;
包下边的类与接口全部使用驼峰命名规则。
(首字母要大写,第二个单词的首字母也要大写。)
注意:要新建**类而不是包**,包名和类名之间用点隔开
可以写为entity.Student
2.实体类与数据库的映射关系:
entity包下的**实体类**要全部保持和数据库的**表名一致**;
类**属性值**要与数据库**字段**对应。
特别说明: 数据库的名应该在application.yaml中配置,连接数据库。
3.如果数据库有d_id,在字段中要改为**驼峰**命名。
4.类中属性的书写:
private string name
权限 类型 属性名
5.设置get、set方法的快捷键为:Alt+Inser
4、配置文件
我们可以通过配置文件来更改那些自动配置的属性。SpringBoot启动时加载该配置文件。Springboot默认的全局配置文件有两个,一个是application.properties,另一个是application.yaml。
4.1 application.yaml文件格式
k:空格)v //表示一对键值对(空格必须有);属性和值也是大小写敏感;
如
spring:
profiles:
active: prod
spring:
profiles: dev
# 略去配置
spring:
profiles: test
# 略去配置
spring:
profiles: prod
# 略去配置
4.1.1 参数详解
server:
port: 8080
//指定server的端口
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/vcd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
//指定Spring 连接池来源(这个写完之后会提示你导入相应的maven依赖)
max-active: 30
min-idle: 5
validation-query: SELECt 1 FROM DUAL
max-wait: 10000
min-evictable-idle-time-millis: 30000
//设置连接池的连接数量、时间等属性
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
//连接的动作和设置prepareStatement
filters: stat,wall,log4j2
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
web-stat-filter:
enabled: true
url-pattern: "
@Bean(name = "info")
public Info getInfo(){
return new Info("gfagduis", 2343);
}
@Bean(name = "info1")
public Info getInfo1(){
return new Info("gfagdufasfdfdais", 2343);
}
}
5.3.4 @Bean产生一个bean的方法
- @Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。
- 支持别名@Bean(“xx-name”)
- 作用在类上和方法上,用来配置 Spring Bean 的作用域
- 它标识Bean 的作用域
属性介绍
value
singleton 表示该bean是单例的。(默认)
prototype 表示该bean是多例的,即每次使用该bean时都会新建一个对象。
request 在一次http请求中,一个bean对应一个实例。
session 在一个httpSession中,一个bean对应一个实例。
proxyMode
DEFAULT 不使用代理。(默认)
NO 不使用代理,等价于DEFAULT。
INTERFACES 使用基于接口的代理(jdk dynamic proxy)。
TARGET_CLASS 使用基于类的代理(cglib)。
5.4 Service层
5.4.1 @Service
- @Service是@Component注解的一个特例,作用在类上
- @Service用于标注服务层组件,表示定义一个Bean
- @Service注解作用域默认为单例
- 使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
- @Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
- @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字
- @Table(name ="数据库表名"),这个注解也注释在实体类上,对应数据库中相应的表
- @Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column
引入单个properties文件:
@PropertySource(value = {"classpath : xxxx/xxx.properties"})
引入多个properties文件:
@PropertySource(value = {"classpath : xxxx/xxx.properties","classpath : xxxx.properties"})```
5.6.2 @ImportResource
- 导入xml配置文件
- 可以额外分为两种模式 相对路径classpath,绝对路径(真实路径)file
注意:单文件可以不写value或locations,value和locations都可用
相对路径(classpath)
引入单个xml配置文件:@ImportSource("classpath : xxx/xxxx.xml")
引入多个xml配置文件:@ImportSource(locations={"classpath : xxxx.xml" , "classpath : yyyy.xml"})
绝对路径(file)
引入单个xml配置文件:@ImportSource(locations= {"file : d:/hellxz/dubbo.xml"})
引入多个xml配置文件:@ImportSource(locations= {"file : d:/hellxz/application.xml" , "file : d:/hellxz/dubbo.xml"})
取值:使用@Value注解取配置文件中的值
@Value("${properties中的键}")
private String xxx;
5.6.3 @Import
- 导入额外的配置信息
- 可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
5.7 全局异常处理
5.7.1 @ControllerAdvice
- 统一处理异常
- 定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
}
5.7.2 @ExceptionHandler
- 注解声明异常处理方法
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
String handleException(){
return "Exception Deal!";
}
}
5.8 事务注解
- 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式
- @Transactional注解
- 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,Spring推荐使用TransactionTemplate。
- 声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用



