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有什么区别

BeanFactoryApplicationContext
它使用懒加载它使用即时加载
它使用语法显式提供资源对象它自己创建和管理资源对象
不支持国际化支持国际化
不支持基于依赖的注解支持基于依赖的注解

(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

八、MVC

https://maokun.blog.csdn.net/article/details/118652454

posted @ 2021-06-26 14:27  茅坤宝骏氹  阅读(6)  评论(0)    收藏  举报  来源