Spring篇
Spring
目录
1.1.14-ApplicationContext的加载方式
1.1.16-Spring 基于 xml 注入 bean 4种方式
1.1.19-@Autowired注解和@Resource的区别
1.1.1-什么是框架
在我看来的话,框架可能会更加的像一个通用的工具,它可以直接拿来使用简化我们一些结构,步骤,我们可以更具自己项目的拓展添加更多的组成部分,更加快速的提高生产力
例如我们需要做饭,首先要有材米油盐,框架就像是把材米油盐打包成了一个工具箱,我们每次做饭的时候就不用到超时购买,可以直接打开这个工具箱,获取到需要的材料
1.1.2-什么是Spring
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
主要模块:
-
Spring Core:核心类库,提供 IOC 服务;
-
Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);
-
Spring AOP:提供AOP 服务;
-
Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
-
Spring ORM:对现有的 ORM 框架的支持;
-
Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
-
Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。
1.1.3-Spring-IOC
Ioc就是指的控制反转,将创建对象的控制权转移,我们之前创建一个对象的时候都是由自己去new一个对象的,完全是自己去把控,有了Spring之后,就可以交给Spring进行控制管理,同时解除了接口和实现的耦合性。
核心原理:配置文件+反射(工厂也可以)+容器
DI 依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖 IoC 容器来动态注入对象需要的外部资源。
1.1.4-DI依赖注入
和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖 IoC 容器来动态注入对象需要的外部资源。
1.1.5-Spring 的 IOC 有三种注入方式
- 构造器注入
- setter 方法注入
- 注解注入
1.1.6-Spring-AOP
AOP是面向切面,作为面向对象的一种补充。主要适用于和一些业务无关但是对多个对象产生影响的公共行为和逻辑,封装成一个可以重复利用的模块,这个模块被称为切面。一般用于权限处理,权限判断,日志,事务等非主要业务逻辑的事情。
1.1.7-AOP术语
-
连接点( Joinpoint ):可以被增强的方法都可以成为连接点
-
切点( Pointcut ):真正被拦截到的点
-
增强( Advice ):拦截后要做的事情,对方法增加权限的校验等
-
目标对象(Target):要被增强的对象
-
引介(Introduction)
-
织入(Weaving):指advice应用到target的过程
-
代理(Proxy)
-
切面(Aspect)
博主之前写过的文章,有对AOP术语详细的介绍:AOP
1.1.8-AOP的底层
底层是采用JDK动态代理和CGLIB动态代理实现的
博主之前写过的文章,有对AOP术语详细的介绍:AOP
1.1.9-Spring 的两大核心
- IOC
- AOP
1.1.10-Spring 的两大核心接口
- BeanFactory
- ApplicationContext
ApplicationContext 是 BeanFactory 的子接口
1.1.11-BeanFactory的功能
BeanFactory是Spring最底层的接口,包含了各种各样的Bean,包括bean的配置,管理bean的加载,实例化,控制,生命周期等,同时还维护着bean直接的依赖关系。
1.1.12-BeanFactory的加载方式
BeanFactroy 采用的是延迟加载形式来注入 Bean 的,当我们要使用某一个Bean的时候,需要调用getBean方法来加载实例化,通常以变成的方式创建。
更多BeanFactory加载可以参考:https://my.oschina.net/chengxiaoyuan/blog/803213
1.1.13-ApplicationContext的功能
作为 BeanFactory的派生类,在BeanFactory原有的功能外,更是提供了更加完整的功能,比如继承 MessageSource,统一的资源文件访问方式,提供在监听器中注册 bean 的事件,同时加载多个配置文件等,载入多个上下文
1.1.14-ApplicationContext的加载方式
容器一经启动,就会创建所有的Bean。启动时就可以直观的发现Spring配置文件中的错误,有利于检查依赖属性是否注入。但是ApplicationContext会比较占用空间。
1.1.15-Bean的作用域
singleton
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
prototype
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
request
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
session
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
global-session
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
更多作用域问题参考:理解Spring框架中Bean的作用域
1.1.16-Spring 基于 xml 注入 bean 4种方式
-
Set 方法注入
-
构造器注入
-
静态工厂注入
-
实例工厂
1.1.17-Spring 的自动装配
在 Spring 框架 xml 配置中共有 5 种自动装配:
- no:默认的方式是不进行自动装配的,通过手写xml设置 ref 属性来进行装配 bean。
- byName:按bean名称自动装配
- byType:通过参数的数据类型进行自动装配。
- constructor:利用构造函数进行装配,并且构造函数的参数通过 byType 进行装配。
- autodetect:首先会尝试使用constructor进行自动装配,如果失败再尝试使用byType。
自动装配详细参考:彻底搞明白Spring中的自动装配和Autowired
1.1.18-@Autowired注解是什么?
Spring管理的Bean对象可以采用自动装配机制为属性赋值。基于注解方式进行自动装配,一般使用@Autowired,@Qualifer,@Resource这些注解。
1.1.19-@Autowired注解和@Resource的区别
@Autowired:默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
@Resource:默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
区别详细参考:@Autowired注解和@Resource的区别
1.1.20-Spring所用到的设计模式
-
工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例
-
单例模式:Bean 默认为单例模式
-
代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术
-
模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
1.1.21-Spring事务传播行为
百度图片:
propagation_Required:需要 如果需要存在一个事务,则支持当前事务,如果没有事务则开启
propagation_Supports:支持 如果存在一个十五,支持当前事务,如果没有食物,则非事务执行
propagation_Mandatory:必须 如果已经存在一个事务,支持当前事务,如果没有一个活动的事务,则 抛出异常
propagation_Required_new:总是开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起
propagation_Not_supports:总是非事务地执行,并挂起任何存在的事务
propagation_Never:绝不 总是非事务执行,如果存在一个活动事务,则抛出异常
propagation_Nested:嵌套的 如果有就嵌套,没有就开启事务
1.1.22-Spring事务的特征
Spring的事务特征类似于MySQL的基本特征
原子性(Atomicity)
- 所有操作要么全部成功,要么全部失败回滚
一致性(Consistency)
- 要么成功,要们失败,失败了要对前面的操作进行回滚,要保持一致
隔离性(Isolation)
- 多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,事务开始后,不能背其他的事务干扰
持久性(Durability)
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
1.1.23-脏读,幻读,不可重复读的问题
出现脏读,幻读,不可重复读是事务可能会产生的问题
- 脏读:脏读是指当一个事务正在访问数据,并且对数据进行了修改。而这种修改还没有提交到数据库中,这时,另外一个事务也访问了这个数据,然后使用了这个数据。(准备数据回滚了,读取了提交的数据)
- 幻读:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到了表中的全部数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。(读取了修改前的数据)
- 不可重复读:一个事务多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A每次读取同一数据时,结果不一致。(读取了插入前的数据)
1.1.24-Spring事务的隔离级别
Spring的隔离级别类似于MySQL的隔离级别
-
read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
-
read committed(读已提交数据):允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
-
repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
-
serializable(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,性能会非常低。
1.1.25-Spring 框架中不同类型的事件
-
上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
-
上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
-
上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
-
上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
-
请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件
1.1.26-Spring的通知类型
1、前置通知org.springframework.aop.MethodBeforeAdvice
在目标方法执行前实施增强
2、后置通知org.springframework.aop.AfterReturningAdvice
在目标方法执行后实施增强
3、环绕通知org.aopalliance.intercept.MethodInterceptor
在目标方法执行前后实施增强
4、异常抛出通知org.springframework.aop.ThrowsAdvice
在方法抛出异常后实施增强
5、最终通知
目标方法执行之后执行的通知
详细参考本人之前写过的一篇文章,写的不好请见谅:之前写的文章AOP增强
1.1.27-Spring实现事务控制的两种方式
声明式事务和编程式事务
声明式事务:用配置文件的方法或注解方法控制事务,其中包括了很多声明属性,它是通过AOP
实现的,自己不用额外的写代码,只要在Spring
配置文件中声明即可;通常用在数据库的操作里面;
编程式事务:就是指通过手写代码的方式做事务处理,这种处理方式需要写代码,事务中的逻辑可以自己定制;可以是数据库的操作,也可以是其他的操作。
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解