Spring框架的好处
- 轻量:基本的版本大约是2M
- IOC(控制反转):Spring通过控制反转实现了松散耦合,对象们给出他们的依赖,而不是创建和查找依赖的对象
- AOP(面向切面的编程):把应用业务逻辑和系统服务区分开
- 容器:spring包含并管理应用中对象的生命周期和配置
- MVC框架:SpringMVC是基于servlet的一套web框架,使用dispatcherServlet,ModelAndView和view Resolver等可以快速而且很好的搭建一个web服务和接口
- 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务,下至全局事务
- 异常处理:Spring提供方便的api把技术相关的异常转换为一致的unchecked异常
依赖注入
依赖注入,是IOC的一个方面,你不用创建对象,只需要描述它是怎么被创建的,不用在代码里面直接创建需要的对象,而是描述所需要的对象,之后容器负责将所需要的对象注入进去
依赖注入的方式
- 构造器注入:通过容器触发一个类的构造器来实现,该类有一系列参数,每个参数代表对其他类的依赖
- setter注入:容器通过调用无参构造器或者无参static工厂方法实例化bean之后,调用bean的setter方法
使用构造器注入实现强制依赖,使用setter注入实现可选依赖
springBean
- spring beans 是形成spring应用的主干java对象,被ioc容器初始化,装配和管理
spring中所有的bean默认都是单例的,可以通过修改bean属性改变 - 一个spring bean 定义包括容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期和依赖
如何给spring容器提供配置元数据
- 基于XML配置
- 基于注解配置
- 基于java api的配置
如何定义类的作用域
当定义一个bean,在spring里我们还可以给这个bean申明一个作用域,可以通过定义bean的scope属性来配置,如果要求每次都实例化一个新的bean,scope可以设为prototype,默认是singleton,表示每次都是同一个实例bean
bean的作用域
- singleton:每个ioc容器只有一个实例bean
- prototype:每次请求都生成一个新的实例bean
- request:每次http请求都创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
- session:在一个 http session中,一个bean定义对应一个实例,仅在基于web的SpringApplicationContext情形下有效
- global-session:在一个全局的http session中,一个bean定义对应一个实例,仅在基于web的springApplicationContext情形下有效
缺省的作用域是singleton,spring框架中的bean不是线程安全的
bean装配
指的是spring容器把bean组装到一起,前提是容器知道bean的依赖关系,然后通过依赖注入把他们装配到一起
bean的自动装配
- no:默认是不通过自动装配,使用显示设置ref属性来装配
- byName:通过参数名自动装配,容器自动装配和该bean的属性有相同名字的bean
- byType:通过参数类型自动装配,容器会自动装配和该bean属性有相同类型的bean,如果出现多个会抛出异常
- constructor:类似于byType,要给构造器提供参数,如果没有确定的带参数的构造器参数类型,会抛出异常
- autodetect: 首先尝试用constructor来自动装配,如果无法工作,则使用byType
Spring注解
基于java的配置,允许在少量的java注解的帮助下,进行大部分的spring配置,而不是使用xml
比如:@Configuration,用来标记的类可以当做一个bean的定义,被spring IOC容器使用;@Bean,表示此方法将要返回一个对象,作为一个bean注册进spring的上下文
基于注解的容器配置
通过在相应的类,方法,或者属性上使用注解的方式,直接组件类中进行配置,而不需要使用xml来描述bean的装配关系
spring开启注解装配
需要在spring配置文件中显式配置<context:annotation-config>
spring事务管理
支持:编程式事务管理和声明式事务管理
- 编程式事务管理:通过编程的方式管理事务,灵活性较大,但是难维护
- 声明式事务管理:通过注解或者xml配置管理事务,可以将业务逻辑和事务管理分开
spring框架为不同的框架提供了统一的编程模式,更好集成各种数据访问抽象层,同时提供了简单的事务管理api和声明式事务管理
事务传播
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播
public void methodA(){
methodB();
//doSomething
}
@Transaction(Propagation=XXX)
public void methodB(){
//doSomething
}
-
Spring中七种事务传播行为:
- PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果当前处于其他事务中,就加入到这个事务中
- PROPAGATION_SUPPORT:支持当前事务,如果当前没有事务,就以非事务方式执行
- PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
- PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
-
spring中5种事务隔离级别
- ISOLATION_DEFAULT:默认级别,保持和数据库一致
- ISOLATION_READ_UNCOMMIT:读未提交,其他事务能够读取当前事务未提交的数据,会造成脏读
- ISOLATION_READ_COMMINT:读已提交,其他事务只能读取当前事务已提交的数据,但是会造成不可重复读
- ISOLATION_REPEATABLE_READ:可重复读,在一个事务里两次查询结果一样,但是会造成幻读
- ISOLATION_SERIALIZABLE:串行化,所有的操作都是串行化的,能避免脏读,不可重复读和幻读
脏读、不可重复读、幻读
- 脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
- 不可重复读:指在一个事务内,多次读同一数据,在这个事务还没有结束时,另外一个事务也访问该同一数据,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
- 幻读:当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
AOP
面向切面的编程,允许程序模块化横向切割关注点,或者横切典型的责任划分,如日志和事务管理
- Aspect切面:AOP的核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块包含一组api提供横切功能,比如:一个日志模块可以称作日志的aop切面,可以通过@Aspect注解的类实现
- spring切面可以分为5种通知:
- before:方法执行前被调用
- after: 方法执行后被调用,无论是否执行成功
- after-returning: 方法执行成功之后调用
- after-throwing: 方法抛出异常退出时执行
- around: 方法执行之前和之后调用
spring MVC
spring构建web的全功能MVC框架,允许以声明的方式把请求参数和业务对象绑定
DispatcherServlet
springMVC是围绕DispatcherServlet来设计的,他负责处理所有的http请求和响应
WebApplicationContext
继承了ApplicationContext并增加了一些web特有的功能,能找到被关联的servlet
springMVC的控制器
提供了一个访问应用程序的接口,控制器将用户的输入转成一个视图呈现给用户
@controller
控制器类注解
@RequestMapping
用来映射一个URL到一个类的指定方法上
Springboot
spring boot 是spring大家庭中的一员,旨在帮助开发者快速并且简单的构建项目,大多数springboot项目只需要很少的配置文件
- 独立运行spring项目
spring boot 可以打包成jar独立运行,只要有JRE,就可以运行
- 内嵌servlet容器
spring boot内嵌Tomcat,jetty等容器,无需以war包形式部署项目
- 提供starter简化maven配置
springboot 提供了一系列的start pom来简化maven的依赖加载,
- 自动装载spring
springboot会根据类路径的jar包,类,为jar包里面的类自动配置bean,极大的减少开发的配置
- 准生产的监控
springboot提供基于http ssh telnet对运行时项目的监控
- 无代码生产和xml配置
springboot不是借助代码生产实现的,而是通过条件注解实现的
springboot优点
- 快速构建项目
- 支持主流框架的集成
- 项目可以独立运行,无需外部依赖servlet容器
- 提供运行时的监控
- 极大的提高开发,部署效率
- 与云计算的天然集成
SpringBoot常用注解
- @RestController/@Controller
- @RequestMapping/@PostMapping/@GetMapping/@DeleteMapping
- @Service/@Repository
- @Configuration/@Component
- @EnableAutoConfiguration/@EnableAsync/@SpringBootApplication
- @Autowired/@Qualifier