从面相对象的抽象能力讲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的数组等集合的特性<br>
还包含了3个注解的接口,说明spring在往注解上发展
HierarchicalBeanFactory
BeanFactory getParentBeanFactory()<br>
层级的关键体现
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()<br>
boolean isConfigurationFrozen()
void preInstantiateSingletons()
加载非延迟单例bean
ApplicationContext<br>
同时扩展了ListableBeanFactory, HierarchicalBeanFactory<br>
支持其他特性
Environment<br>
MessageSource<br>
ApplicationEventPublisher<br>
ResourcePatternResolver
自己还描述了一些抽象能力
本身是可描述的实例,有生命周期
id,name,启动时间等<br>
支持层级,getParent
AutowireCapableBeanFactory getAutowireCapableBeanFactory()
不太典型的一些应用场景,先不管
ConfigurableApplicationContext
什么叫可配置
配置id
配置parent<br>
配置Environment
添加BeanFactoryPostProcessor
添加ApplicationListener<br>
添加ProtocolResolver
refresh()
配置变化了,需要更新
生命周期
registerShutdownHook()
close()
isActive()
ConfigurableListableBeanFactory getBeanFactory()
所以,用的是组合的方式来实现BeanFactory的
什么叫可配置,该context是有生命周期的,但却可以配置来修改。调用refresh方法,来更新内部BeanFactory,从而提供不一样的Bean工厂<br>
WebApplicationContext
绕不开的web项目
声明了一些常量
包括扩展了bean的web生命周期scope_*
ServletContext getServletContext()
AbstractApplicationContext<br>
applicationContext的第一个抽象类
来看看它具象了什么,抽象了什么
extends DefaultResourceLoader
直接继承了解析资源的能力
spring应用程序运行时扩展全部从配置资源而来
implements ConfigurableApplicationContext
implements DisposableBean
也是个Bean。先有鸡还是蛋?
具象
生命周期
active
closed
shutdownHook
destroy()<br>
void close()<br>
void start()
void stop()
boolean isRunning()
lifecycleProcessor<br>
可配置性
id
parent<br>
environment<br>
ConfigurableEnvironment
resourcePatternResolver<br>
beanFactoryPostProcessors
publishEvent
applicationEventMulticaster<br>
applicationListeners<br>
earlyApplicationEvents
messageSource<br>
国际化
refresh()
refresh的大部分方法都用了pretected访问级别
标准的模板方法模式,同时支持子类扩展
基本定义了一个applicationContext加载过程
获取一个beanFactory
配置这个beanFactory
执行非延迟加载单例bean
Object getBean(String name)<br>
<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)<br>
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()<br>
initPropertySources()<br>
ConfigurableListableBeanFactory obtainFreshBeanFactory()
void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
引出问题:现在beanFactory有了,在做些注入准备。现在有bean了没有?有什么?
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
子类注入BeanDefinition
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)<br>
加工BeanDefinition
void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)
注入Bean处理器
bean肯定还没加载
void initMessageSource()
void initApplicationEventMulticaster()
初始化事件广播器
void initLifecycleProcessor()<br>
void registerListeners()<br>
注入事件监听器
void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)<br>
这里就有no lazy bean加载的过程
beanFactory.preInstantiateSingletons();
其实是委托给内部那个beanFactory来实现的
void finishRefresh()<br>
只做了几个生命周期事件处理和事件发布
void doClose()<br>
void destroyBeans()<br>
ConfigurableListableBeanFactory的实现来看bean装载
DefaultListableBeanFactory
void preInstantiateSingletons()
分别看看几个关键的ApplicationContext子类获取的BeanFactory是哪个实现
AnnotationConfigWebApplicationContext
可以看到他的实现只做了loadBeanDefinition等,所以BeanFactory在上一层抽象中已经完成
最终一直抽象到AbstractRefreshableApplicationContext
与之对应的另外一层抽象GenericApplicationContext<br>
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的<br>
AnnotationConfigApplicationContext
构造
void scan(String... basePackages)<br>
springboot做了什么
用SpringApplication启动一个spring应用
setInitializers<br>
setListeners
prepareContext
把environment和listeners等绑定到context上<br>
refreshContext
((AbstractApplicationContext) applicationContext).refresh()<br>
SpringApplicationRunListeners
starter包原理
dao层接口bean注入方法
AOP动态代理注入方法
springcloud扩展了context的标准?
扩展了refresh方法吗?没有
扩展出来了一个boostrap.*的配置,怎么做到的?
属于哪个步骤做的事情?
这个过程中能用spring技术吗?
config是怎么读取外部配置的,什么时机?
面向对象
特点是:封装、继承、多态
核心能力:
抽象能力
抽象是的能力,有什么,能做什么
实现的是怎么做
文档说明
该文档没有详细讲解IOC等内容,只从抽象层次上将spring做的事情分解开
有了这张地图,下面springboot和springcloud中的几个知识点应该很容易找到地方并分解开
0 条评论
下一页