Spring
2023-08-30 16:59:55 0 举报
登录查看完整内容
Spring
作者其他创作
大纲/内容
Spring 架构图
提供一个JDBC模版
能享受到Spring管理事务的好处
JDBC
提供\"对象-关系\"映射框架无缝集成API
使用Spring管理事务
ORM
提供一个支持Object/XML映射的抽象实现
OXM
JMS
事务模块 支持编程和声明式事务管理
Transactions
Data Access/Integration 数据访问集成
提供基本的Web开发集成特性
Web
SpringMVC框架提供了基于注解的请求资源注入
提供了一个SpringMVCWeb框架的实现
Servlet
提供了简单的接口
WebSocket
提供Portlet环境中使用MVC实现类似于WebSocket Server模块功能
Portlet
Web 模块
Beans
Core 核心模块
建立在Core和Bean模块的基础之上
资源绑定
数据验证
国际化
JavaEE支持
容器生命周期
事件传播
集成Beans模块功能并添加一下功能
ApplicationContext接口是上下文模块的焦点
Context 上下文模块
支持算数和逻辑运算
支持从Spring容器获取Bean
提供了强大的表达式语言支持
SpEL模块
Core Container Spring的核心容器
面向切面编程的实现
AOP
Aspects
Instrumentation
提供了 对消息传递体系结构和协议支持
Messaging
模块详解
Spring 结构体系
架构详情
@Componet
定义业务逻辑层的服务组件
@Service
@Rpository
@Controller
Bean声明
@Autowired
@Resource
Bean注入
@Configuration
@Bean
@ComponetScan
配置类注解
@EnableAspectJAutoProxy
@Aspect
AOP注解
@Scope
@PostConstruct
@PreDestroy
@Value
@PropertySource
属性支持注解@Bean
@EnableAsync
@Async
异步操作注解
@EnableScheduling
@Sceduled
定时任务相关
@EnableConfigurationProperties
@EnableWebMVC
@EnableJpaRepositories
@EnableTransactionManagement
@EnableCaching
开启功能支持
@RunWith
@ContextConfiguration
测试相关注解
@RequestMapping
@ResponseBody
@PathVariable
@RestController
@ExceptionHandler
@InitBinder
SpringMVC注解
简述
常用注解
注解
基础
jar依赖相对较小
运行期间消耗的系统资源也比较小
轻量级框架
对象与对象之间的依赖关系交给Spring来管理
Spring通过控制反转技术实现对象之间的解耦
控制反转
面向容器
通过面向切面技术主动将系统逻辑植入业务逻辑当中
横切关注点
横切关注点的抽象
切面Aspect
连接点
对连接点进行拦截定义
切入点Pointcut
拦截到连接点之后要执行的具体操作
前置通知
后置通知
成功通知
失败通知
异常通知
环绕通知
通知advice
代理的目标对象
目标对象
将切面应用到目标对象并执行代理对象创建的过程
植入
在运行期为类动态的添加一些方法或字段而不用修改类的代码
引入
核心概念
基于接口的动态代理
主要通过java.lang.reflect包中Proxy类和InvocationHandler接口来实现
JDKd
基于子类的动态代理 Enhancer
可以运行期间扩展java类和实现java接口
采用ASM字节码生成框架,使用字节码技术生成代理类,比使用 Java 反射效率要高
CGLIB 的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对 final 修饰的类进行代理
CGLib
AOP代理方式
面向切面
基于容器化管理对象
框架灵活
特性
实例化BeanDefinitionReader注解配置读取器
用于指定的包目录进行扫描查找bean对象
实例化ClassPathBeanDefinitionScanner路径扫描器
初始化容器 注册内置的BeanPosProcessor的BeanDefinition到容器中
将配置类的BeanDefinition注册到容器里
刷新容器前的预处理
prepareRefresh()
获取容器初始化时创建的BeanFactory
obtainFreshBreanFactory()
prepareBeanFactory(beanFactory)
postProcessBeanFactory(beanFactory)
BeanFactory标准初始化之后执行的BeanFactoryPostProcess的方法 即BeanFactory后置处理器
invokeBeanFactoryPostProcessors(benaFactory)
向容器中注册Bean的后置处理器BeanPostProcessor
主要是干预Spring初始化bean的流程
registerBeanPostProcessors(beanFactory)
初始化MessageSource
initMessageSource()
initApplicationEventMulitcaster()
onRefresh()
将容器中的所有ApplicationListener注册到事件派发器中
并派发之前步骤产生的事件
注册监听器
registerListeners()
初始化所有剩下的单实例bean
核心的方法是preInstantiateSingletons()会调用getBean()方法创建对象
finshBeanFactoryInitialization(beanFactory)
发布BeanFactory容器刷新完成事件
finishRefresh()
调用refresh()方法刷新容器
启动流程
实例化Instantiation
属性赋值 Populat
初始化Initialization
销毁Destruction
四个阶段
对于BeanFactory容器->createBean()
对于ApplicationContext容器->获取BeanDefinition中的信息
实例化bean
实例化后的对象被封装在BeanWrapper对象中
根据BeanDefinition中的信息
以及通过BeanWrapper提供设置属性的接口完成属性设置与依赖注入
设置对象属性(依赖注入)
会调用它实现的setBeanName(String beanId)方法,传入Bean的名字
BeanNameAware接口
调用setBeanClassLoader()方法,传入ClassLoader对象的实例
BeanClassLoaderAware
会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身
BeanFactoryAware
会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
ApplicationContextAware
处理Aware接口
Bean实现了BeanPosProcessor接口
BeanPostProcessor前置处理
执行afeterPropertiesSet()方法
Bean实现了InitializingBean接口
InitializingBean
Bean在Spring配置文件中配置了 init-method 属性
则会自动调用其配置的初始化方法
init-method
Bean实现了BeanPostProcessor接口
BeanPostProcessor
当Bean不再需要时,会经过清理阶段
会调用其实现的destroy()方法
Bean实现了DisposableBean这个接口
DisposableBean
Bean的Spring配置中配置了destroy-method属性
会自动调用其配置的销毁方法
destroy-method
具体流程
Spring默认的作用域
该模式下多线程是不安全的
singleton单例模式
prototype原型模式
request
session
Global Session
SpringBean的作用域
Bean生命周期
name 名字
class name 类名
scope 作用域
isLazylnit 是否懒加载
DependsOn 依赖其他的bean
AutowireCandidate 是否自动注入 只对Autowired注解有效
isPrimary 是否是主要候选bean
FactoryBeanName Bean的工厂类
FactoryMethodName Bean 的工厂方法
ConstructorArgumentValues Bean 构造方法参数值、所有属性
isSingleton 是否是单例
isPrototype 是否是原型
isAbstract 是否是抽象 Ture代表容器无需对Bean实例化
OriginatingBeanDefinition 获取原始的Bean定义
主要包括一下bean的定义
子BeanDefinition会从父BeanDefinition中继承没有的属性
每次需要用到BeanDefinition都进行一次合并
BeanDefinition合并
定义
提供了一个获取属性跟设置属性的方法
AttributeAccessor
作用是可以持有XML文件的一个bean标签对应的Object
BeanMetadataElement
继承的类
其用来操作注解元数据。 通过注解方式得到的 Bean(@Component、@Bean)
AnnotatedGenericBeanDefinition 通过@Import导入的类
ConfigurationClassBeanDefinition 通过@Bean的方式
其实现类
AnnotatedBeanDefinition
被GenericBeanDefiniton 替代
ChildBeanDefinition
运行时统一BeanDefinition 视图
Spring 启动初始化的几个实例的BeanDefinition的类型都是RootBeanDefinition
RootBeanDefinition
Spring2.5 以后新加入的 BeanDefinition 实现类
GenericBeanDefinition 可以动态设置父 Bean
同时兼具 RootBeanDefinition 和 ChildBeanDefinition 的功能
通过注解配置以及配置类(@Bean 除外)的BeanDefinition类型都是GenericBeanDefinition
ScannedGenericBeanDefinition 通过扫描包的方式
getMetadata 获取注解信息
相对父类多提供
AnnotatedGenericBeanDefinition 通过注解的方式
子类实现
GenericBeanDefinition
定义默认值
AbstractBeanDefinition
子类
相关的类
BeanDefinition(bean定义)
定制化Bean的创建逻辑
其最大的一个作用是:可以让我们自定义Bean的创建过程
返回对象实例
创建bean的Class类型
是否是单例,默认为单例的
主要功能
FactoryBean(工厂bean)
获取bean实例
获取bean的提供者(对象工厂)
判断是否包含bean
主要提供了一下功能
根据指定名称或指定类型获取bean
getBean
获取指定的Bean的提供者
getBeanProvider
检查容器中是否含有这个名称的Bean
containsBean
Bean是否为单例
isSingleton
Bean是否为原型=
isPrototype
Bean类型是否匹配
isTypeMatch
返回指定Bean的类型
getType
返回指定Bean的别名
getAliases
FactoryBean定义的详情
对顶层的BeanFactory做了扩展
主要提供了对BeanFactory的配置能力
并扩展了忽略依赖
自动装配判断
冻结bean的定义
枚举所有bean名称的功能
ConfigurableListableBeanFactory
子类ConfigurableBeanFactory(提供了对容器的配置能力)
提供了对父容器的访问功能
HierarchicalBeanFactory(提供了访问父容器的能力)
根据指定类型获取容器中的对应的Bean的名称,可能会有多个
获取添加了指定注解的Bean的名称
ListableBeanFactory(提供了对bean的枚举能力)
主要提供了自动装配能力
类中的方法都跟装配Bean,配置Bean相关
AutowireCapableBeanFactory(提供了自动装配能力)
实现了大部分的方法,其中最终的实现为getBean()/doGetBean()方法的实现,提供了模版。其实createBean抽象方法,还是子类去实现的
提供ConfigurationBeanFactorySPI的全部功能
实现的抽象基类
实现从某些后端资源获取 beanDefinitions
可以用作bean工厂实现的基类
通过DefaultSingletonBeanRegistry、单例或者原型确定
该类提供了一个单例缓存
给定的bean名称检索bean定义
getBeanDefinition
为给定的bean定义创建bean实例
createBean
DefaultListableBeanFactory.getBeanDefinition
AbstractAutowireCapableBeanFactory.createBean
操作的默认实现可以在
子类要实现的主要模板方法
AbstractBeanFactory
抽象bean工厂超类,实现默认bean创建
具有RootBeanDefinition类指定的全部功能
AbstractBeanFactory的createBean
AutowireCapableBeanFactory 接口的实现
提供bean创建(带有构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动连接构造函数、按名称列出的配置和按类型列出的配置
用于按类型自动注入
对于能够搜索其bean定义的工厂,通常将通过这种搜索实现匹配bean
对于其他工厂样式,可以实现简化的匹配算法
resolveDependency
子类要实现的主要模板方法是
AbstractAutowireCapableBeanFactory
BeanDefinitionRegistry bean定义信息注册中心
Spring内部的唯一使用的工厂实现(XmlBeanFactory已废弃)基于bean definition对象,是一个成熟的bean factroy
默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definition对象,是一个成熟的bean factroy
它是整个bean加载的核心部分,也是spring注册加载bean的默认实现
描述
DefaultListableBeanFactory (重点 最终实现类)
子类扩展的接口
详细功能
BeanFactory(bean工厂)
后置工厂处理器
可以对Bean配置元数据(这里的配置元数据其实指的就是BeanDefinition)进行操作
允许其BeanFactoryPostProcessor读取指定Bean的配置元数据
并在实例化之前修改它
可以配置多个BeanFactoryPostProcess
BeanDefinitionRegistryPostProcessor
其子类
容器初始化的过程中 首先执行 BeanDefinitionRegistryPostProcessor 然后执行 BeanFactoryPostProcessor
其中优先级数据 PriorityOrdered >Ordered
BeanFactoryPostProcessor 与 BeanDefinitionRegistryPostProcessor 对比
BeanFactoryPostProcessor(bean工厂后置处理器)
postProcessBeforeInitialization 初始化前的后期处理
postProcessAfterInitialization 初始化后的后期处理
接口定义两个回调方法
通过实现这两个方法我们可以提供自己的实例化以及依赖注入等逻辑
如果我们想要在Spring容器完成实例化,配置以及初始化一个Bean后进行一些定制的逻辑
我们可以插入一个甚至更多的BeanPostProcessor的实现
实现Ordered 接口 也可以控制执行顺序
InstantiationAwareBeanPostProcessor 实例化感知Bean后置处理器
DestructionAwareBeanPostProcessor 销毁后感知Bean后置处理器
BeanPostProcessor(bean后置处理器)
在XML文件中用${…}替换指定的properties文件中的值
这个类主要包含定义了属性的加载方法
PropertiesLoaderSupport
这个类主要可以对读取到的属性进行一些转换
PropertyResourceConfigurer
主要负责对占位符进行解析
PlaceholderConfigurerSupport
继承以下接口
PropertyPlaceholderConfigure()属性处理器
应用程序运行时,可根据客户端操作系统的国家/地区,语言的不同而显示不同的界面
不同的环境提供不同的资源文
MessageSource 国际化资源
事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法。
事件源:ApplicationEventPublisher 发布事件
事件监听器:EventListener 监听消费
ApplicationEventPublisher 事件发布功能
通过EnvironmentCapable激活具体的运行环境
返回值Environment->继承PropertyResolver从而可以操作程序运行时的属性资源
EnvironmentCapable 获取容器当前运行的环境
PropertyResolver ->接口中主要提供了对当前运行环境中属性的操作
DefaultResourceLoader->ProtocolResolver 自定义协议解析器
ResourceLoader 加载资源文件
getInputStream 获取资源文件IO流
每次调用都将返回一个当前资源对应的java.io. InputStream字节流
InputStreamSource 父类
大多数Resource的实现类的基类,提供了很多通用的方法
基于java的文件系统封装而成的一个资源对象
FileSystemResource
将URL解析成文件引用,既会处理协议为:“file“的URL,也会处理JBoss的”vfs“协议。然后相应的解析成对应的文件系统引用。
AbstractFileResolvingResource
根据一个给定的字节数组构建的一个资源。同时给出一个对应的输入流
ByteArrayResource
只是对BeanDefinition进行的一次描述性的封装
BeanDefinitionResource
流资源的转换
InputStreamResource
HTTP
FTP
File
UrlResource代表URL资源,用于简化URL资源访问。
UrlResource
使用Class对象的getResource(String path)获取资源URL
使用ClassLoader对象的getResource(String path)获取资源URL
ClassPathResource
抽象基类AbstractResource
Resouce
BeanFactory 负责配置,创建,管理bean,IOC功能的实现主要就依赖于该接口子类实现
主要继承的能力
定义了一堆常量,以及一个方法,约束了所有的web容器必须能返回一个Servlet的上下文(ServletContext)
WebApplicationContext 最顶级接口
applicationContext.xml 路径配置 默认/WEB-INF/applicationContext.xml
ConfigurableWebApplicationContext 指定上下文配置加载的位置
在web程序启动的时候,提供一个configLocations属性
AbstractRefreshableWebApplicationContext
XmlWebApplicationContext
WebApplicationContext的实现它接受注释类作为输入
AnnotationConfigWebApplicationContext
相关子类
web体系
ConfigurableApplicationContext
抽象公共的上下文特性
AbstractApplicationContext
AbstractRefreshableApplicationContext
添加了对指定的配置文件路径的公共的处理
可以把他看作基于XML的应用上下文的基类
AbstractRefreshableConfigApplicationContext
用于描绘包含能被XmlBeanDefinitionReader所理解的bean定义的XML文档
AbstractXmlApplicationContext
通用上下文的实现
它的内部持有一个DefaultListableBeanFactory的实例
GenericApplicationContext
提供了注解配置和类路径扫描(scan方法)的支持
AnnotationConfigApplicationContext
非web体系
体系拆分
ApplicationContext(上下文)
BeanWrapper对Spring中的Bean做了包装,为的是更加方便的操作Bean中的属性
能够描述javaBean中的属性,通过属性描述符我们能知道这个属性的类型,获取到操纵属性的方法(getter/setter)
PropertyDescriptor(属性描述符)
就是用来注入属性编辑器(PropertyEditor)
PropertyEditorRegistry(属性编辑器注册器)
是JavaBean规范定义的接口
而Spring将其扩展,方便各种对象与String之间的转换工作。
直接通过字面值来设置Bean中的属性
SpringMVC在解析请求参数时,也是使用的PropertyEditor
Spring中对PropertyEditor使用的实例
PropertyEditor(属性编辑器)
如果某个值要给赋值给bean属性,Spring都会把这个值包装成ProperyValue对象
ProperyValue
PropertyAccessor(属性访问器)
定义了进行类型转换时的一些规范,就像名字定义的那样,主要用来做类型转换
通常(但不一定)与PropertyEditorRegistry接口一起实现
由于TypeConverter实现通常基于PropertyEditors
TypeConverter(类型转换器)
用于封装PropertyAccessor的配置方法的接口
还扩展了PropertyEditorRegistry接口
该接口定义了PropertyEditor管理的方法
ConfigurablePropertyAccessor(可配置属性访问器)
相关接口能力
对Bean进行包装
对Bean的属性进行访问以及设置
在操作属性的过程中,必然涉及到类型转换,所以还有类型转换的功能
主要实现功能
属性都是私有的
有无参的public构造方法
对私有属性根据需要提供公有的getXxx方法以及setXxx方法
getters必须有返回值没有方法参数;setter值没有返回值,有方法参数
JDK中提供了一套API用来访问某个属性的getter/setter方法,这些API存放在java.beans中,这就是内省(Introspector)
JavaBean(一种特殊的类,主要用于传递数据信息)
内省机制
java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法;它针对的是任意类
反射可以操作各种类的属性
反射可直接操作属性Field
反射
内省(Introspector):是Java语言对JavaBean类属性、事件的处理方法
内省只是通过反射来操作JavaBean的属性
内省设置属性值肯定会调用setter方法
内省
内省和反射的区别
涉及java机制
PropertyEditorRegistrySupport,PropertyEditorRegistry的基础上做了进一步的扩展,提供的还是属性编辑器注册的功能
TypeConverterSupport 接口实现了TypeConverter,所以它具有类型转换的能力
AbstractPropertyAccessor 只是实现了批量设置属性的方法,真正的setPropertyValue还是留待子类实现
AbstractNestablePropertyAccessor 这个类开始真正的将属性访问跟类型转换结合到一起,它真正的实现了setPropertyValue
接口实现
源码分析
BeanWrapper(基础设施中心)
将返回数据调整成指定格式或者指定类型返回到前端页面
Printer 将T类型的数据根据Locale信息打印成指定格式,即返回字符串的格式
通过聚合接口对String类型数据的解析以及格式化
CurrencyStyleFormatter 货币
PercentStyleFormatter 百分比
NumberStyleFormatter 正常数字
DateFormatter 时间格式化
FormatterRegistry注册这些格式化器
@EnableWebMvc 配置SpringMVC中的格式化器
具体子类
Formatter(数据格式)
@Valid是JSR的规范,来源于javax.validation包下
@Validated是Spring自身定义的注解,位于org.springframework.validation.annotation包下
@Validated无法作用在字段上,正因为如此它就无法完成对级联属性的校验
@Valid的 没有这个限制。
@Validated注解中可以提供一个属性去指定校验时采用的分组
@Valid没有这个功能,因为@Valid不能进行分组校验
@Valid对JavaBean的校验
@Validated对JavaBean嵌套属性的校验效果
@Validated跟@Valid的区别
Bean Validation(数据校验)
PropertyEditorRegistry 属性编辑器注册表
TypeConverter 类型转换器
BeanWrapperImpl跟DataBinder DataBinder底层也是同样也是采用了Java的内省机制只会根据setter方法以及getter来设置或者获取Bean中的属性
Data Binder(数据绑定)
Resource(资源)
Spring源码关键字
Spring基础
Spring
0 条评论
回复 删除
下一页