Spring总结
一、Spring概览
(1)简介
Spring是一个轻量级 Enterprise Java的开源开发框架。Spring Framework的核心功能可用于开发任何Java应用程序,但有一些扩展用于在Java EE平台之上构建Web应用程序。Spring框架的目标是通过启用基于POJO的编程模型,使Java EE开发更易于使用并促进良好的编程实践。
(2)模块
1、核心容器(Core Container)
spring-core:核心类库,其他模块大量使用此jar包;
spring-beans:Spring定义Bean的支持;
spring-context:运行时Spring容器;
spring-context-support:Spring容器对第三方包的集成支持,比如邮件服务、视图解析
spring-expression:Spring表达式语言
2、AOP
spring-aop:基于代理的AOP支持
spring-aspects:基于AspectJ的AOP支持
spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器
spring-instrument-tomcat:针对tomcat的instrument实现
3、数据访问/集成
spring-jdbc:提供以jdbc访问数据库的支持;
spring-tx:提供编程式和声明式事务支持;
spring-orm:提供对象/关系映射支持;
spring-oxm:提供对象/xml映射支持;
spring-jms:提供对JMS(java消息服务)的支持;
4、web
spring-web:提供基础的web集成功能;
spring-webmvc:基于servlet的MVC;
spring-webmvc-portlet:基于portlet的mvc实现;
spring-websocket:提供websocket功能;
5、test&messaging
spring-test:spring测试,提供junit与mock测试功能;
spring-messaging:对消息架构和协议的支持;
(3)优点
1)轻巧、控制反转、解耦,简化开发
2)集成各种优秀框架
3)降低 Java EE API 的使用难度
4)方便程序的测试
5)AOP 编程的支持
6)声明式事务的支持
二、注解
@Bean:java配置bean定义,作用于方法
@Component:注解配置Bean,作用于类
@Repository
@Service
@Controller
@RequestMapping
@Required
@Autowired
三、设计模式
设计模式9种
简单工厂(BeanFactory)
工厂方法(FactoryBean)
单例(getSingleton)
适配器(HandlerAdatper)
装饰器(Wrapper、Decorator)
代理(AOP)
观察者(ApplicationListener)
策略(Resource )
模板(JdbcTemplate)
四、Spring的bean
(1)bean作用域
singleton、prototype、request、session、global-session(基于Portlet的Web应用才有意义,Spring5已经没有)
(2)bean生命周期
1.Bean的定义。
2.Reflection API创建Bean的实例
3.属性值set()方法设置。
4.Aware接口调用相应的方法,BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
5.BeanPostProcessor接口,执行postProcessBeforeInitialization()
6.InitializingBean接口,执行afterPropertiesSet()方法
7.定义init-method方法执行
8.BeanPostProcess接口,执行postProcessAfterInitialization()
9.销毁Bean实现了DisposableBean接口,执行destroy()
10.销毁Bean定义destroy-method方法执行
重要的bean生命周期方法
属性(init-method和destroy-method)
注释(@PostConstruct和@PreDestroy)
(3)单例bean的线程安全问题
1.在bean对象中尽量避免定义可变的成员变量(不太现实)。
2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)
(4)自动装配
1、Bean 装配
当bean在Spring容器中组合在一起时,装配或者bean装配就是这种情况。装配bean时,Spring容器需要知道需要什么bean以及容器应该如何使用依赖注入将它们绑定在一起。
2、Bean自动装配
Spring容器能够自动连接协作bean之间的关系。这意味着可以通过检查BeanFactory的内容而不使用和元素来自动让Spring解析bean的协作者(其他bean)
3、自动装配类型
no
byName
byType:
constructor
autodetect
自动装配的局限性
覆盖、基础数据类型、令人困惑的性质
(5)bean循环依赖
1)循环依赖类型
①构造器的循环依赖:这种依赖spring是处理不了的,直 接抛出BeanCurrentlylnCreationException异常。
②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖。
③非单例循环依赖:无法处理。
2)利用三级缓存(DefaultSingletonBeanRegistry中定义)
singletonObjects用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用
earlySingletonObjects 存放原始的 bean 对象(尚未填充属性)
singletonFactories 存放 bean对应的工厂对象(ObjectFactory)
(6)Spring的内部beans是什么
当bean仅用作另一个bean的属性时,可以将其声明为内部bean。Spring的基于XML的配置元数据提供了bean定义中元素的使用,以便定义所谓的内部bean。内部bean总是匿名的,它们总是作为原型。
五、Spring事务
(1)管理事务方式
编程式事务、声明式事务
声明式事务分为两种:
a、基于XML的声明式事务
b、基于注解的声明式事务
(2)事务隔离级别
ISOLATION_DEFAULT(Mysql:REPEATABLE_READ;Oracle:READ_COMMITTED)
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
(3)事务传播行为
支持当前事务:
PROPAGATION_REQUIRED:加入旧事务,否则创建新事务
PROPAGATION_SUPPORTS:加入旧事务,否则非事务运行
PROPAGATION_MANDATORY: 加入旧事务;否则抛出异常(mandatory:强制性)
不支持当前事务:
PROPAGATION_REQUIRES_NEW: 创建新的事务,挂起旧事务
PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,挂起旧事务
PROPAGATION_NEVER: 以非事务方式运行,存在旧事务抛出异常
其他情况:
PROPAGATION_NESTED: 如果存在事务,则创建新事务来嵌套事务运行;如果没有事务,等价于PROPAGATION_REQUIRED。
(4)事务管理接口
1、PlatformTransactionManager:Spring 事务结构中的核心接口
2、TransactionInfo:事务信息对象( 事务管理器,事务定义对象,目标方法唯一标识,事务状态对象,外层的TransactionInfo)
3、TransactionStatus:事务状态(TransactionInterceptor.currentTransactionStatus() 静态函数)
4、TransactionDefinition:事务定义对象(@Transactional 注解中设置的各种信息)
5、TransationSynchronization:事务同步回调接口,在事务周期的各个点执行回调方法
在Spring - Mybatis 整合时,正式Mybatis 正式利用了TransationSynchronization同步器,才让Mybatis 的事务管理交给了 Spring 事务来管理。
6、TransactionSynchronizationManager:事务运行过程中,保存一些状态,比如:数据库连接
7、SuspendedResourceHolder:挂起事务时,记录被挂起事务的运行时信息,便于内部事务运行结束后,恢复外层事务
(5)Spring事务管理的优点
1、提供不同的事务API 如:JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式
2、为编程式事务管理提供了一套简单的API而不是一些复杂的事务API
3、支持声明式事务管理
4、和Spring各种数据访问抽象层很好得集成
(6)Spring事务的实现方式和实现原理
1、划分处理单元——IOC:
由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring中的IOC划分了事务处理单元。并且将对事务的各种配置放到了ioc容器中(设置事务管理器,设置事务的传播特性及隔离机制)。
2、AOP拦截需要进行事务处理的类
Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,事务对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。
读取ioc容器事务配置属性,转化为spring事务处理需要的内部数据结构(TransactionAttributeSourceAdvisor),转化为TransactionAttribute表示的数据对象。
3、对事务处理实现(事务的生成、提交、回滚、挂起):
spring委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource数据源支持、hibernate数据源事务处理支持、JDO数据源事务处理支持,JPA、JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager、AbstractPlatforTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的TransactionManager。
4、结合
PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个Spring声明式事务处理的设计体系。
(7)事务失效
1、只有@Transactional 注解应用到 public 方法,才能进行事务管理
2、目标类里的自我调用没有事务
六、IOC容器
(1)spring IOC 容器
BeanFactory:BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端
要求时实例化 bean。
ApplicationContext:ApplicationContext 接口扩展了 BeanFactory 接口。它 在 BeanFactory 基础上提供了一些额外的功能。
(2)ApplicationContext的常见实现
FileSystemXmlApplicationContext:XML文件bean的定义
ClassPathXmlApplicationContext:XML文件java bean的定义,在CLASSPATH中查找bean配置XML文件
WebXmlApplicationContext:从Web应用程序加载的所有bean类定义的XML文件
(3)Bean Factory和ApplicationContext有什么区别
BeanFactory | ApplicationContext |
---|---|
它使用懒加载 | 它使用即时加载 |
它使用语法显式提供资源对象 | 它自己创建和管理资源对象 |
不支持国际化 | 支持国际化 |
不支持基于依赖的注解 | 支持基于依赖的注解 |
(4)Spring中的依赖注入DI
在依赖注入中,不必创建对象,但必须描述如何创建它们。不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC容器将它们装配在一起。
(5)多少种方式完成依赖注入
构造函数注入
setter 注入
接口注入
(6)Spring容器提供配置元数据
Spring容器提供配置元数据有三种重要方法:
1、基于XML的配置文件
2、基于注释的配置
3、基于Java的配置
(7)IoC 的好处
1、它将最小化应用程序中的代码量。
2、它将使应用程序易于测试,因为它不需要单元测试用例中的任何单例
或 JNDI 查找机制。
3、 它以最小的影响和最少的侵入机制促进松耦合。
4、 它支持即时的实例化和延迟加载服务。
(8)Spring IoC 的实现机制
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
(9)Resource 查找和加载
Resource 接口是 Spring 资源访问策略的抽象,它本身并不提供任何资源访问实现,具体的资源访问由该接口的实现类完成——每个实现类代表一种资源访问策略。 Spring 为 Resource 接口提供了如下实现类:
UrlResource:访问网络资源的实现类。
ClassPathResource:访问类加载路径里资源的实现类。
FileSystemResource:访问文件系统里资源的实现类。
ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类:
InputStreamResource:访问输入流资源的实现类。
ByteArrayResource:访问字节数组资源的实现类。 这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问。
七、AOP
https://maokun.blog.csdn.net/article/details/118652372