从面相对象的抽象能力讲spring的设计
2021-11-06 08:44:08 0 举报
AI智能生成
spring的BeanFactory,applicationContext等类图有很多,spring启动过程分析也很多。但经常迷失在其中,找不到方向。本文从抽象能力依次分解spring的层次关系。从抽象到具象来理解那些ApplicationContext各自的职责。
作者其他创作
大纲/内容
BeanFactory
获取Bean,是否包含Bean等Bean的一些能力抽象
Bean是一个具体业务对象,因此没有用专门的类来描述bean
但从一些判断接口可以发现:bean有是否单例SCOPE、有别名等特性
ListableBeanFactory
是否包含bean,bean的个数,所有beanName的数组等集合的特性
还包含了3个注解的接口,说明spring在往注解上发展
HierarchicalBeanFactory
BeanFactory getParentBeanFactory()
层级的关键体现
boolean containsLocalBean(String name)
这里是一个工具接口,区分与标准的包含Bean
AutowireCapableBeanFactory
factory.config包中,一种支持
可配置
ConfigurableBeanFactory
ConfigurableListableBeanFactory
忽略自动注入系列
void ignoreDependencyType(Class<?> type)
void ignoreDependencyInterface(Class<?> ifc)
registerResolvableDependency
指定注入
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
BeanDefinition
BeanDefinition getBeanDefinition(String beanName)
void freezeConfiguration()
boolean isConfigurationFrozen()
void preInstantiateSingletons()
加载非延迟单例bean
ApplicationContext
同时扩展了ListableBeanFactory, HierarchicalBeanFactory
支持其他特性
Environment
MessageSource
ApplicationEventPublisher
ResourcePatternResolver
自己还描述了一些抽象能力
本身是可描述的实例,有生命周期
id,name,启动时间等
支持层级,getParent
AutowireCapableBeanFactory getAutowireCapableBeanFactory()
不太典型的一些应用场景,先不管
ConfigurableApplicationContext
什么叫可配置
配置id
配置parent
配置Environment
添加BeanFactoryPostProcessor
添加ApplicationListener
添加ProtocolResolver
refresh()
配置变化了,需要更新
生命周期
registerShutdownHook()
close()
isActive()
ConfigurableListableBeanFactory getBeanFactory()
所以,用的是组合的方式来实现BeanFactory的
什么叫可配置,该context是有生命周期的,但却可以配置来修改。调用refresh方法,来更新内部BeanFactory,从而提供不一样的Bean工厂
WebApplicationContext
绕不开的web项目
声明了一些常量
包括扩展了bean的web生命周期scope_*
ServletContext getServletContext()
AbstractApplicationContext
applicationContext的第一个抽象类
来看看它具象了什么,抽象了什么
extends DefaultResourceLoader
直接继承了解析资源的能力
spring应用程序运行时扩展全部从配置资源而来
implements ConfigurableApplicationContext
implements DisposableBean
也是个Bean。先有鸡还是蛋?
具象
生命周期
active
closed
shutdownHook
destroy()
void close()
void start()
void stop()
boolean isRunning()
lifecycleProcessor
可配置性
id
parent
environment
ConfigurableEnvironment
resourcePatternResolver
beanFactoryPostProcessors
publishEvent
applicationEventMulticaster
applicationListeners
earlyApplicationEvents
messageSource
国际化
refresh()
refresh的大部分方法都用了pretected访问级别
标准的模板方法模式,同时支持子类扩展
基本定义了一个applicationContext加载过程
获取一个beanFactory
配置这个beanFactory
执行非延迟加载单例bean
Object getBean(String name)
<T> T getBean(String name, Class<T> requiredType)
<T> T getBean(Class<T> requiredType)
boolean containsBean(String name)
boolean isSingleton(String name)
boolean isPrototype(String name)
...
boolean containsBeanDefinition(String beanName)
int getBeanDefinitionCount()
String[] getBeanDefinitionNames()
String[] getBeanNamesForType(ResolvableType type)
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType)
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
抽象
abstract void refreshBeanFactory()
abstract void closeBeanFactory()
abstract ConfigurableListableBeanFactory getBeanFactory()
可扩展
createEnvironment()
prepareRefresh()
initPropertySources()
ConfigurableListableBeanFactory obtainFreshBeanFactory()
void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
引出问题:现在beanFactory有了,在做些注入准备。现在有bean了没有?有什么?
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
子类注入BeanDefinition
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
加工BeanDefinition
void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)
注入Bean处理器
bean肯定还没加载
void initMessageSource()
void initApplicationEventMulticaster()
初始化事件广播器
void initLifecycleProcessor()
void registerListeners()
注入事件监听器
void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
这里就有no lazy bean加载的过程
beanFactory.preInstantiateSingletons();
其实是委托给内部那个beanFactory来实现的
void finishRefresh()
只做了几个生命周期事件处理和事件发布
void doClose()
void destroyBeans()
ConfigurableListableBeanFactory的实现来看bean装载
DefaultListableBeanFactory
void preInstantiateSingletons()
分别看看几个关键的ApplicationContext子类获取的BeanFactory是哪个实现
AnnotationConfigWebApplicationContext
可以看到他的实现只做了loadBeanDefinition等,所以BeanFactory在上一层抽象中已经完成
最终一直抽象到AbstractRefreshableApplicationContext
与之对应的另外一层抽象GenericApplicationContext
BeanFactory处理差异
AbstractRefreshableApplicationContext
体现出刷新,调用则删除重建
loadBeanDefinitions(beanFactory)
AnnotationConfigWebApplicationContext
XmlWebApplicationContext
GenericApplicationContext
构造的时候构造了BeanFactory
且不允许刷新
但提供了注入BeanDefinition的方法
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
void removeBeanDefinition(String beanName)
据说更灵活的bean管理办法,且在cloud中有发挥作用
BeanDefinition Loader
AnnotationConfigWebApplicationContext
XmlWebApplicationContext
GenericApplicationContext子类是如何loadBean的
AnnotationConfigApplicationContext
构造
void scan(String... basePackages)
springboot做了什么
用SpringApplication启动一个spring应用
setInitializers
setListeners
prepareContext
把environment和listeners等绑定到context上
refreshContext
((AbstractApplicationContext) applicationContext).refresh()
SpringApplicationRunListeners
starter包原理
dao层接口bean注入方法
AOP动态代理注入方法
springcloud扩展了context的标准?
扩展了refresh方法吗?没有
扩展出来了一个boostrap.*的配置,怎么做到的?
属于哪个步骤做的事情?
这个过程中能用spring技术吗?
config是怎么读取外部配置的,什么时机?
面向对象
特点是:封装、继承、多态
核心能力:
抽象能力
抽象是的能力,有什么,能做什么
实现的是怎么做
文档说明
该文档没有详细讲解IOC等内容,只从抽象层次上将spring做的事情分解开
有了这张地图,下面springboot和springcloud中的几个知识点应该很容易找到地方并分解开
0 条评论
下一页