Spring系列复习(一)
相关导航
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全家桶学习路线
1、 思维导图
二、系列基础概念梳理
1、Spring
- Spring是一个开源的轻量级的
Java开发框架
,其中包括SpringMVC、SpringBoot、SpringCloud、SpringSecurity、反应式编程。
1.1 Bean
- Bean是计算机
自动生成
的类,Bean是一个由SpringIOC容器
实例化、组装和管理的对象
- Bean
并不是程序员编辑
的,而是程序运行时
,由Spring通过反射
生成的 - Spring通过
依赖注入
的方式来管理Bean之间的依赖关系
1.2 Injection(注入)
- Spring注入可以理解为是对一个对象进行初始化,也就是
省去new的这个步骤
- 如果遇到修改,只需要改
一处
就行了。
1.3 DI(依赖注入)
- Dependency Injection,是IOC的另一个名字,
自动满足Bean之间的依赖
- 是Spring协调不同
Bean实例之间的合作
而提供的一种工作机制,在确保Bean实例之间合作
的同时,并能保持每个Bean的相对独立性
- 创建被调用者的实例的工作由IOC容器来完成,然后
注入
调用者,因此也称为依赖注入
1.4 Spring ApplicationContext(应用上下文)
- 又称之为
容器
(container) - 负责对象整个生命周期的管理(
创建
、装配
、销毁
) - 可以简单理解为工厂,负责造对象的
- 利用
IOC
设计思想,Spring的核心之一
注
:Spring的设计模式是工厂模式
1.4.1 IOC容器
- 全称是 Inversion Of Control,是一种设计思想,
控制反转
- 开发者
不需
自己主动创建对象
和管理
对象之间的依赖关系
,即将控制权交给IOC容器
,负责对象的创建、管理和销毁 - 简单来说,对象需要的时候,就自动地生成对象,不用再去创建
- 要容器造什么对象、对象之间有什么依赖关系是由开发者自己决定的,
自动满足Bean之间的依赖
1.4.2 IOC容器类别
1)Spring BeanFactory容器
- 最简单的容器,给DI提供了基本的支持
- 移动设备中为了节省有限的资源,会被优先选择,即主要用于轻量级应用
- 包 org.springframework.beans.factory.BeanFactory
2)Spring ApplicationContext容器
- 在Spring BeanFactory容器的
基础
上,添加了更多企业特定
的功能,也就是比BeanFactory更加优秀更加牛逼了。 - 包 org.springframework.context.ApplicationContext
1.5 AOP(面向切面编程)
- 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
的过程
1.6 Wire(装配)
- 一种是将Bean和属性进行对应,即将属性装配在Bean中
- 一种是IOC/DI,就是控制反转/依赖注入,
自动满足Bean之间的依赖
1.7 Annotion(注解)
- 注解(Annotation)为Java
代码
提供元数据
- 注解的属性也叫做
成员变量
。注解只有成员变量,没有方法 - 想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去的一张标签
- 详情请戳这个博客
1.8 Servlet
- Server Applet,服务程序
- 运行在服务器上的一个小程序,用来
处理服务器请求
的
1.9 微服务
- 微服务是针对与单体架构而言的,是项目开发的一种架构
- 微服务得从两个方面去理解,什么是"微"、什么是"服务"
- 微,狭义来讲就是
体积小
,所谓服务,一定要区别于系统,服务一个
或者一组
相对较小且独立
的功能
单元,是用户可以感知最小功能集
。 - 微服务的目的是有效的
拆分应用
,实现敏捷开发
和部署
,使各种服务淞耦合
- 对于微服务架构来说,
分布式
几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。 - 不适合业务非常底层的系统,如
操作系统内核
、存储系统
、数据库系统
等
1.9.1 微服务设计原则
1)单一职责原则
每个微服务只需要实现自己的业务逻辑
就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。
2)服务自治原则
每个微服务从开发、测试、运维等都是独立的
,包括存储的数据库也都是独立的
,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。
3)轻量级通信原则
首先是通信的语言
非常的轻量
,第二,该通信方式
需要是跨语言、跨平台的
,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。
4)接口明确原则
由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活
,从而尽量避免其它模块也做调整。
1.10 Cloud Native(云原生)
- 应用
原生
被设计在云
上以最佳方式运行
,充分发挥云的优势 - 云原生代表着
原生为云设计
,即充分利用云资源
,以云上运行为最佳目标
设计应用 - 云的出现,可以在提供各种资源之外,还提供各种能力,从而帮助应用,使得应用可以
专注于业务需求的实现
- 非业务需求相关的功能都被移到云,或者说基础设施中去了,以及下沉到基础设施的中间件
- 像虚拟化、弹性扩展、高可用、高容错性、自恢复这些都是云的基本属性,云原生作为一种云计算,这是所具备的第一层含义
三、SpringMVC(略)
- SpringMVC解决了V与C的交互问题,M是Model,V是View,C是Controller,是MCV架构
- 在SpringMVC中,只使用了1个
DispatcherServlet
去接收所有的请求
,然后进行分发
到不同的Controller中的某个方法,从而,减少Servlet对象
的数量 - 主要是通过
接收分发请求
减少Servlet对象
的数量
四、SpringBoot
1、定义
Spring快速开发脚手架
,通过约定大于配置
的方式,快速构建和启动Spring
项目。
2、特性
快速开发Spring应用的框架
内嵌Tomcat和 Jetty 容器
,不需要单独安装容器,使用main
方法就可以直接启动发布
一个Web应用
- 简化 Maven 配置,通过
继承parent构件
,一站式引入需要的各种依赖
(启动器),简化依赖管理
【优化混乱的管理】 - 通过
约定大约配置
的方式可以实现基于注解
的零配置思想
【优化复杂的配置】 - 和各种
流行框架
, Spring MVC , Mybatis , Spring Cloud无缝整合
3、项目框架
3.1 基础框架
- ① 直接用IDEA新建SpringBoot项目会
默认生成
的一些文件,根据个人查的资料是对于项目本身没用的,可以删除。 - ②自动生成的SpringBoot
启动类
。 - ③自动生成的SpringBoot
项目配置文件
(或者是.yml文件格式),默认是空的,什么内容也没有,可以根据项目需求自行添加。 - ④自动生成的项目test目录,写
测试类
时会用到。 - ⑤项目的pom.xml文件,用来管理项目所有依赖。【进阶:可以利用parent来管理依赖】
3.1.1 启动类格式
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基本信息
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion> //声明项目描述符遵循哪一个POM模型版本。//模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,//这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。<groupId>com.funtl</groupId>//公司或者组织的唯一标志,并且配置时生成的路径也是由此生成,//如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade<artifactId>itoken-dependencies</artifactId>//本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的<version>1.0.0</version>//本项目目前所处的版本号<packaging>war</packaging>//打包类型,可取值:pom , jar , maven-plugin , ejb , war , ear , rar , par等等<name>itoken dependencies</name>//项目的名称, Maven产生的文档用,可省略<url>www.funtl.com</url>//项目主页的URL, Maven产生的文档用 ,可省略
</project>
- 依赖关系
<project>...<dependencies><dependency><groupId>sample.ProjectB</groupId>//同上<artifactId>Project-B</artifactId>//同上<version>1.0</version>//同上<scope>compile</scope><optional>true</optional> <!-- value will be true or false only --></dependency></dependencies>
</project>
注意 <dependencies>
和<dependencyManagement>
的区别
<dependencies>
相对于<dependencyManagement>
,所有声明在<dependencies>
里的依赖都会自动引入
,并默认被所有的子项目继承
。<dependencyManagement>
<dependencyManagement>
里只是声明依赖
,并不实现引入
。
- 继承关系
通过<parent>
实现
----父项目
<project>[...]<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.4</version><scope>test</scope></dependency></dependencies>[...]
</project>----子项目
[...]
<parent><groupId>com.devzuz.mvnbook.proficio</groupId><artifactId>proficio</artifactId><version>1.0-SNAPSHOT</version><relativePath>../ParentProject/pom.xml</relativePath>
</parent>
[...]relativePath默认为…/pom.xml,如果路径不一样需要手动指定
- 聚合关系 用于将多个maven项目聚合为一个大的项目
通过<modules>
实现
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org.maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.park.mvnDemo.account</groupId><artifactId>account-aggregator</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><name>Account Aggregator</name><modules><module>account-email</module><module>account-persist<module></modules>
</project>
1)Maven内置属性
${basedir}
项目的根目录
(包含pom.xml文件的目录
)${version}
项目版本
2)POM属性
${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}"
3.2.2 Maven的parent属性
可以分成多个目录进行解耦
开发
-
主要可以分为
基础功能模块
、工具组件
、管理端
、客户端
、辅助功能模块
。 -
由于Maven的多模块聚合结构,
父模块的<modules>
记录着所有的子模块
-
在每一个
子模块
中也都标明了自己的父模块
的配置信息
-
父模块
的<modules>
中记录了子模块的artifactId
,子模块
中<parent>
也记录着父模块
的配置信息
-
子模块中
<parent>中的<relativePath>
中记录的是父项目相对于子项目
的路径
。这样的逻辑是,在构建子项目
的时候首先根据相对路径
找到父项目
子模块可以继承父模块的元素
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心元素
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- contributors:项目的贡献者信息
- distributionManagement:项目的部署信息
- issueManagement:项目的缺陷跟踪系统信息
- ciManagement:项目的持续集成系统信息
- scm:项目的版本控制系统信息
- mailingLists:项目的邮件列表信息
- properties:项目的依赖配置
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositories:项目的仓库配置
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
- reporting:包括项目的报告输出目录配置、报告插件配置等
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><modules><module>mogu_utils</module><module>mogu_base</module><module>mogu_xo</module><module>mogu_admin</module><module>mogu_web</module><module>mogu_picture</module><module>mogu_sms</module><module>mogu_search</module><module>mogu_monitor</module><module>mogu_gateway</module><module>mogu_zipkin</module><module>mogu_spider</module><module>mogu_commons</module></modules>
3.2.3 Spring Boot层级介绍与使用
一般的项目模块中都有Entity
、Mapper
、VO
、Service
、Controller
层。
其关系如下
其中,这张图还少个Entity层,是在Mapper层下面。
1)Controller层
- 控制请求和响应,负责前后端交互,
分发请求
- Controller层主要调用
Service层
里面的接口实现控制具体的业务流程
控制的配置
也要在配置文件
(yml或者properties文件)中进行
2)Service层
- 业务逻辑层,主要进行
业务逻辑
的具体实现 - 分为两种类,一个是
Service接口类
,是具体逻辑的接口
- 一个是
ServiceImpl类
,是对Service接口的实现类,实现
接口中的具体方法 Service的Impl
(实现类)是把Mapper
和Service
进行整合
的文件
3)Mapper层
- 又称
DAO层
,是数据持久化层
,简单理解为对数据库进行增删改查
操作 - 和Service层相同,分为两种类,一种是
Mapper接口类
,主要是数据库操作的接口
- 另一种是MapperImpl即接口实现类,但
Mybatis
使用Java动态代理接口
,不需要实现类
,直接通过Mapper.XML
文件进行配置实现类
4)VO层
Object值对象
- 用于
业务层
之间的数据传递
,仅仅
包含数据
- 将
前端
的需要的数据
做一个整合
,打包成一个类
,方便前端获取数据
- 类中
属性
可以和数据库表中字段
相同
,也可以不同
5)Entity层
- 称为实体层,和数据库中表进行映射与对应
- 只有一个Entity类,有getter和setter方法
Entity书写规范
1.java中包和类的建立和书写:包名可以自己定义,但最好是全部小写;包下边的类与接口全部使用驼峰命名规则。(首字母要大写,第二个单词的首字母也要大写。)注意:要新建**类而不是包**,包名和类名之间用点隔开可以写为entity.Student2.实体类与数据库的映射关系: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.DruidDataSourcedruid:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/vcd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456//指定Spring 连接池来源(这个写完之后会提示你导入相应的maven依赖)max-active: 30min-idle: 5validation-query: SELECT 1 FROM DUALmax-wait: 10000min-evictable-idle-time-millis: 30000//设置连接池的连接数量、时间等属性testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20//连接的动作和设置prepareStatementfilters: stat,wall,log4j2connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000web-stat-filter:enabled: trueurl-pattern: "/*"exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"stat-view-servlet:url-pattern: "/druid/*"allow: 0.0.0.0reset-enable: falselogin-username: adminlogin-password: admin//加入扩展插件thymeleaf:cache: false # 开发时关闭缓存,不然没法看到实时页面mode: LEGACYHTML5 # 用非严格的 HTMLservlet:content-type: text/html//模板渲染引擎配置
4.2 application.properties
相对于.yml
文件,.properties文件使用属性赋值的方式进行配置文件的书写。
格式
属性(可多级,用.连接)=值
如
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret
application.properties常用参数
5、各层常用注解
5.1 启动层
5.1.1 @SpringBootApplication
启动注解
@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration
,@EnableAutoConfiguration
,@ComponentScan
这三个注解
5.1.2 @SpringBootConfiguration
- 继承@Configuration注解,主要用于加载配置文件
- 标注
当前类
是配置类
- 并会将
当前类
内声明的一个或多个以@Bean注解标记的方法
的实例纳入
到Spring容器中,并且实例名
就是方法名
。
5.1.3 @EnableAutoConfiguration
- 开启
自动配置
功能 - 帮助SpringBoot应用将
所有符合条件的@Configuration配置
都加载
到当前SpringBoot
创建并使用的IOC
容器。
5.1.4 @ComponentScan
自动扫描并加载
符合条件的组件或Bean定义
,最终将这些Bean定义加载到容器
中。- 通过
basePackages等属性
指定@ComponentScan自动扫描的范围
5.2 Controller层
5.2.1 @Controller
- 控制器,处理Http请求。
- 整体页面刷新提交的处理注解。
5.2.2 @RestController
- 将方法返回的对象直接在浏览器上展示成json格式
- 相当于@ResponseBody+@Controller合在一起的作用
5.2.3 @RequestBody
- 通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象
5.2.4 @RequestMapping
- 将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
5.2.5 @GetMapping
- 将HTTP get请求映射到特定处理程序的方法
- 简写:@GetMapping(value = “/say”)
5.2.6 @PostMapping
- 将HTTP post请求映射到特定处理程序的方法注解
5.2.7 @PathVariable
- 获取url中的数据
@Controller
@RequestMapping("/User")
public class HelloWorldController {@RequestMapping("/getUser/{uid}")public String getUser(@PathVariable("uid")Integer id, Model model) {System.out.println("id:"+id);return "user";}
}
5.2.8 @RequestParam
- 获取请求参数的值
@Controller
@RequestMapping("/User")
public class HelloWorldController {
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {System.out.println("id:"+id);return "user";
}
5.2.9 @RequestHeader
- 把Request请求header部分的值绑定到方法的参数上
5.2.10 @CookieValue
- 把Request header中关于
cookie的值
绑定到方法的参数
上
5.3 注入Bean
5.3.1 @Autowired
- @Autowired注解作用在构造函数、方法、方法参数、类字段以及注解上
- @Autowired注解可以实现Bean的自动注入
5.3.2 @Component
- 把普通Entity实例化到Spring容器中
- @Component就是告诉Spring,我是Entity类,把我注册到容器中
5.3.3 @Bean
- 一个
方法级别
上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里 - 当Spring需要创建指定的一个对象时会调用被这个注解(@Bean)注解的方法
示例:Spring在需要自动创建Info对象时,自动调用这个方法。
@Configuration
public class BeanInit {/*** 测试@Bean的作用*/@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”)
5.3.5 @Scope
- 作用在
类
上和方法
上,用来配置 Spring Bean 的作用域 - 它标识
Bean
的作用域
属性介绍
valuesingleton 表示该bean是单例的。(默认)prototype 表示该bean是多例的,即每次使用该bean时都会新建一个对象。request 在一次http请求中,一个bean对应一个实例。session 在一个httpSession中,一个bean对应一个实例。proxyModeDEFAULT 不使用代理。(默认)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名字
5.5 Entity层
5.5.1 @Entity
@Table(name ="数据库表名")
,这个注解也注释在实体类
上,对应数据库中相应的表
- @Id、@Column注解用于标注实体类中的
字段
,pk字段标注为@Id
,其余@Column
5.6 配置文件导入
5.6.1 @PropertySource
引入单个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)@ResponseBodyString handleException(){return "Exception Deal!";}
}
5.8 事务注解
- 在Spring中,事务有两种实现方式,分别是
编程式事务管理
和声明式事务管理
两种方式 - @Transactional注解
- 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,Spring推荐使用TransactionTemplate。
- 声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用