spring
2021-05-27 07:54:31 11 举报
AI智能生成
spring知识脑图
作者其他创作
大纲/内容
模块
Spring Context
提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)
Spring Core
核心类库,所有功能都依赖于该类库,提供IOC和DI服务
Spring AOP
AOP服务
Spring Web
提供了基本的面向Web的综合特性,
提供对常见框架如Struts2的支持,
Spring能够管理这些框架,
将Spring的资源注入给框架,
也能在这些框架的前后插入拦截器
提供对常见框架如Struts2的支持,
Spring能够管理这些框架,
将Spring的资源注入给框架,
也能在这些框架的前后插入拦截器
Spring MVC
提供面向Web应用的Model-View-Controller,即MVC实现
Spring DAO
对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务
Spring ORM
对现有的ORM框架的支持
优点
spring属于低侵入式设计,代码的污染极低
spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性
Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用
spring对于主流的应用框架提供了集成支持
IOC
控制反转
指创建对象的控制权转移给Spring框架进行管理,
并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系
并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系
java反射机制
三种注入方式
构造器注入
setter方法注入
根据注解注入
AOP
面向切面
用于将那些与业务无关,
但却对多个对象产生影响的公共行为和逻辑,
抽取并封装为一个可重用的模块,
这个模块被命名为“切面”(Aspect),
但却对多个对象产生影响的公共行为和逻辑,
抽取并封装为一个可重用的模块,
这个模块被命名为“切面”(Aspect),
优点
减少系统中的重复代码
降低了模块间的耦合度
提高系统的可维护性
作用
权限认证
日志
事务处理
实现方式:代理模式
静态代理
代表为AspectJ
编译时增强,
AOP框架会在编译阶段生成AOP代理类,
并将AspectJ(切面)织入到Java字节码中,
运行的时候就是增强之后的AOP对象
AOP框架会在编译阶段生成AOP代理类,
并将AspectJ(切面)织入到Java字节码中,
运行的时候就是增强之后的AOP对象
动态代理
以Spring AOP为代表
AOP框架不会去修改字节码,
而是每次运行时在内存中临时为方法生成一个AOP对象,
这个AOP对象包含了目标对象的全部方法,
并且在特定的切点做了增强处理,
并回调原对象的方法
而是每次运行时在内存中临时为方法生成一个AOP对象,
这个AOP对象包含了目标对象的全部方法,
并且在特定的切点做了增强处理,
并回调原对象的方法
2种代理方式
JDK动态代理
InvocationHandler接口
InvocationHandler 通过invoke()方法反射来调用目标类中的代码,
动态地将横切逻辑和业务编织在一起
动态地将横切逻辑和业务编织在一起
Proxy类
Proxy类来动态创建目标类的代理类
CGLIB动态代理
名词概念
连接点(Join point)
指程序运行过程中所执行的方法。
在Spring AOP中,一个连接点总代表一个方法的执行
在Spring AOP中,一个连接点总代表一个方法的执行
切面(Aspect)
被抽取出来的公共模块,
可以用来会横切多个对象。
Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,
一个切面可以由多个切点和通知组成
可以用来会横切多个对象。
Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,
一个切面可以由多个切点和通知组成
切面可以在类上使用 @AspectJ 注解来实现
切点(Pointcut)
切点用于定义 要对哪些Join point进行拦截
execution方式
execution方式可以用路径表达式指定对哪些方法拦截
比如指定拦截add*、search*
比如指定拦截add*、search*
annotation方式
annotation方式可以指定被哪些注解修饰的代码进行拦截
通知(Advice)
指要在连接点(Join Point)上执行的动作,
即增强的逻辑,比如权限校验和、日志记录等
即增强的逻辑,比如权限校验和、日志记录等
类型
Around
Before
After
After returning
After throwing
通知类型
前置通知(Before Advice)
在连接点(Join point)之前执行的通知
后置通知(After Advice)
当连接点退出的时候执行的通知(不论是正常返回还是异常退出)
环绕通知(Around Advice)
包围一个连接点的通知,这是最强大的一种通知类型。
环绕通知可以在方法调用前后完成自定义的行为
环绕通知可以在方法调用前后完成自定义的行为
返回后通知(AfterReturning Advice)
在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
抛出异常后通知(AfterThrowing advice)
在方法抛出异常退出时执行的通知
目标对象(Target)
包含连接点的对象,也称作被通知(Advice)的对象
由于Spring AOP是通过动态代理实现的,所以这个对象永远是一个代理对象
织入(Weaving)
通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程
引入(Introduction)
添加额外的方法或者字段到被通知的类
Spring允许引入新的接口(以及对应的实现)到任何被代理的对象
启动流程
(1)初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
① 实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象
② 实例化BeanDefinitionReader注解配置读取器,
用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象
,(BeanDefinition 是 Spring 中极其重要的一个概念,
它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象
,(BeanDefinition 是 Spring 中极其重要的一个概念,
它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
③ 实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象
(2)将配置类的BeanDefinition注册到容器中
(3)调用refresh()方法刷新容器
① prepareRefresh()刷新前的预处理
② obtainFreshBeanFactory():获取在容器初始化时创建的BeanFactory
③ prepareBeanFactory(beanFactory):BeanFactory的预处理工作,向容器中添加一些组件
④ postProcessBeanFactory(beanFactory):子类重写该方法,可以实现在BeanFactory创建并预处理完成以后做进一步的设置
⑤ invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器
⑥ registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能
⑦ initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:
⑧ initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到
⑨ onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑
⑩ registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,并派发之前步骤产生的事件
⑪ finishBeanFactoryInitialization(beanFactory):初始化所有剩下的单实例bean,核心方法是preInstantiateSingletons(),会调用getBean()方法创建对象
⑫ finishRefresh():发布BeanFactory容器刷新完成事件
核心接口
BeanFactory
BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理
ApplicationContext
ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能
继承MessageSource,因此支持国际化
资源文件访问,如URL和文件(ResourceLoader)
载入多个(有继承关系)上下文(即同时加载多个配置文件) ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
提供在监听器中注册bean的事件
区别于联系
①BeanFactroy采用的是延迟加载形式来注入Bean的,只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化
②ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入
③ApplicationContext启动后预载入所有的单实例Bean,所以在运行的时候速度比较快,因为它们已经创建好了。相对于BeanFactory,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢
BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader
Spring Bean生命周期
四个阶段
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
(1)实例化Bean
对于BeanFactory容器,
当客户向容器请求一个尚未初始化的bean时,
或初始化bean的时候需要注入另一个尚未初始化的依赖时,
容器就会调用createBean进行实例化
当客户向容器请求一个尚未初始化的bean时,
或初始化bean的时候需要注入另一个尚未初始化的依赖时,
容器就会调用createBean进行实例化
(2)设置对象属性(依赖注入)
实例化后的对象被封装在BeanWrapper对象中,
紧接着,Spring根据BeanDefinition中的信息
以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入
紧接着,Spring根据BeanDefinition中的信息
以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入
(3)处理Aware接口
Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源
①如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字
②如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例
3如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身
4如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
(4)BeanPostProcessor前置处理
如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法
(5)InitializingBean
如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法
(6)init-method
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法
(7)BeanPostProcessor后置处理
如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术
(8)DisposableBean
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
(9)destroy-method
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
Spring中Bean的作用域
(1)singleton
默认作用域,单例bean,每个容器中只有一个bean的实例
(2)prototype
为每一个bean请求创建一个实例
(3)request
为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
(4)session
与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例
(5)global-session
全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中
基于注解的自动装配方式
@Autowired
默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)
@Resource
默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入
Spring的事务传播机制
① PROPAGATION_REQUIRED
默认传播行为:如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务
② PROPAGATION_REQUIRES_NEW
无论当前存不存在事务,都创建新事务进行执行
③ PROPAGATION_SUPPORTS
如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行
④ PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
⑤ PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行
⑥ PROPAGATION_MANDATORY
如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常
⑦ PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常
Spring中的隔离级别
① ISOLATION_DEFAULT
这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别
② ISOLATION_READ_UNCOMMITTED
读未提交,允许事务在执行过程中,读取其他事务未提交的数据
会脏读
③ ISOLATION_READ_COMMITTED
读已提交,允许事务在执行过程中,读取其他事务已经提交的数据
会产生不可重复读
④ ISOLATION_REPEATABLE_READ
可重复读,在同一个事务内,任意时刻的查询结果都是一致的
会产生幻读
⑤ ISOLATION_SERIALIZABLE
所有事务逐个依次执行
Spring框架中的设计模式
(1)工厂模式
Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式
Bean默认为单例模式
(3)策略模式
例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式
Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法
可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式
Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式
Spring事件驱动模型就是观察者模式的一个经典应用
(8)桥接模式
可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
Spring中5种标准事件
(1)上下文更新事件(ContextRefreshedEvent)
在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发
(2)上下文开始事件(ContextStartedEvent)
当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件
(3)上下文停止事件(ContextStoppedEvent)
当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件
(4)上下文关闭事件(ContextClosedEvent)
当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁
(5)请求处理事件(RequestHandledEvent)
在Web应用中,当一个http请求(request)结束触发该事件。
spring beans特性
依赖查找
生命周期管理
配置元信息
事件
自定义
资源管理
持久化
0 条评论
下一页