bean 初始化
2021-06-06 23:52:26 3 举报
bean
作者其他创作
大纲/内容
调用所有BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口方法 set对应属性
根据Type进行autowired自动装配逻辑
创建GenericBeanDefinition
对@AutoWired标记的属性进行依赖注入
需要解析的bean入栈
initMessageSource
prepareBeanFactory(beanFactory);
属性合并类型的后置处理器 ,这里会调用一些注解扫描的后置处理器
国际化方面 后续看
registerListeners
alias bean 别名
AbstractApplicationContext.refresh
属性进行赋值 xml 驱动的bean会走到这里
判断是否需提前曝光ObjectFactory,条件:单例&允许循环依赖&正在创建;
1,创建StandardEnvironment 2,验证属性信息3,增加application早期监听事件 什么时候加入的???
initPropertySources() getEnvironment().validateRequiredProperties()this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
增加描述信息
根据beanName进行autowired自动装配逻辑
业务类可以实现 这些接口 从而注入对应的类 如实现 ApplicationContextAware 注入ApplicationContextEnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware
确认并加载bean的class
如bean不是合成的&有InstantiationAwareBeanPostProcessor实现类的,调用postProcessAfterInstantiation
注解
获取属性值
应用后置处理器SmartInstantiationAwareBeanPostProcessor,允许返回指定bean的早期引用,若没有则直接返回bean
是否有设置 profile 属性 这里没有设置
是否有依赖
lookup-method解析
空实现,作用参考:AbstractRefreshableWebApplicationContextBeanFactory准备工作完成后做一些定制化的处理,一般结合BeanPostProcessor接口的实现类一起使用,注入一些重要资源(类似Application的属性和ServletContext的属性
这里读取到了spring-config.xml配置
方法太长 不贴出来了 主要就是将BeanDefinition 放入beanDefinitionMapBean name放入到beanDefinitionNames 里面
调用所有后置处理器的postProcessBeforeInitialization方法
如果是SmartInstantiationAwareBeanPostProcessor 则调用getEarlyBeanReference方法
initApplicationEventMulticaster
<import resource=\"springmvc.xml\"/>后续看
onRefresh
构造方法设置
默认空实现。在bean是实例化之前,读取并修改bean元数据信息,如属性信息,元数据信息
如果bean不是合成的且有实现了InstantiationAwareBeanPostProcessor,则尝试调用前置处理器处理器和后置处理器放回这个代理bean
监听器名称增加到多播器的监听器集合中
增加ApplicationListenerDetector在bean初始化之后若是ApplicationListener且为单列模式,则将bean注册到应用的事件多播器上
创建BeanDefinitionParserDelegate 并设置基本属性信息
发布对应事件
空实现
装饰bean一些必要属性 后续看
1,singletonObjects 中获取;2,若1无且bean正在创建从earlySingletonObjects中获取3,若2也无且允许早期引用(主要处理循环依赖问题),则从singletonFactories中获取ObjectFactory的getBean方法 创建改bean【singletonFactories 在 属性赋值前(populateBean) 通过addSingletonFactory增加的】
创建包装类型的bean实例
public AbstractAutowireCapableBeanFactory() { super(); ignoreDependencyInterface(BeanNameAware.class); ignoreDependencyInterface(BeanFactoryAware.class); ignoreDependencyInterface(BeanClassLoaderAware.class); }
设置验证类型
获取bean名称
如果bean不是合成bean &有InstantiationAwareBeanPostProcessor实现类
<property>设置
掉用bean的初始化方法 afterPropertiesSet init 或者自定义初始化方法 如xml配置了init-method
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {\t\trefreshBeanFactory();\t\treturn getBeanFactory();\t}
通过多播器发布早期的监听器 早期???
初始化
protected BeanFactory getInternalParentBeanFactory() {\t\treturn (getParent() instanceof ConfigurableApplicationContext ?\t\t\t\t((ConfigurableApplicationContext) getParent()).getBeanFactory() : getParent());\t}
xml
接下来将BeanPostProcessor进行按照实现了PriorityOrdered,ordered ,没有实现接口分别放到不同的集合中,在按照顺序遍历集合中的BeanPostProcessor名称,获取BeanPostProcessor对象(,如果没有就创建)并保存到beanPostProcessors中
对解析完未设置的属性再进行处理
prepareRefresh()
解析DOM元素为BeanDefinition。bean 初始化最最主要的方法
bean创建过程
初始化一个简单的多播器 如果没有定义的话就初始化简单的多播器
1,创建bean工厂2,加载并解析xml文件,并将解析结果封装成BeanDefinitions 保存到beanMap中
获取创建好的bean实例 和class类型 后续再看
protected DefaultListableBeanFactory createBeanFactory() {\t\treturn new DefaultListableBeanFactory(getInternalParentBeanFactory());\t}
ApplicationListenerDetector 后面的监听事件注册
postProcessBeanFactory(beanFactory);
1,设置类加载器;2,设置EL表达式 解析器 属性解析器3,利用BeanPostProcessor特性给各种Aware接口的实现类注入4,设置忽略自动装配的接口5,设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)6,如果BeanFactory中存在loadTimeWeaver的bean,则增加动态织入功能7,注册各environment,systemProperties,systemEnvironmen组件
registerBeanPostProcessors(beanFactory)
test类xml bean初始化 ClassPathXmlApplicationContext继承了AbstractRefreshableApplicationContext所以这里调用的是它里面的方法protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); this.beanFactory = beanFactory; } catch (IOException ex) { throw new ApplicationContextException(\"I/O error parsing bean definition source for \
finishBeanFactoryInitialization(beanFactory);
qualifier属性设置
invokeBeanFactoryPostProcessors(beanFactory);
meta源信息解析
创建beanFactory
如bw为空 且属性值不为空,则抛出异常如bw为空属性值为空,则退出
调用所有后置处理器的postProcessAfterInitialization方法
注解驱动的bean的流程
如果是注解模式的话,则方法是GenericApplicationContext 类里面的方法
容器是否注册了InstantiationAwareBeanPostProcessors
如果有设置代理bean 就直接返回这个代理bean
获取容器中BeanPostProcessor所有实现类
验证及准备需要覆盖的方法
新建XmlBeanDefinitionReader初始化resourceLoader = new PathMatchingResourcePatternResolver();this.environment = new StandardEnvironment();
replaced-method解析
此时回扫描到自定义的监听器
这里涉及到bean的依赖注入 后续看
读取到了spring-config.xml 转换成 Resource 转换过程暂跳过
beans
三级缓存获取bean
获取source加载器
增加1个BeanPostProcessorChecker 用于检查BeanPostProcessor是否初始化
这里主要对剩余的bean 初始化 getBean createBean doCreateBean
注册监听器
<bean>解析
j解析属性信息。类似abstract,scope 等
子类实现
创建bean
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
给后置处理器一个机会返回代理bean
finishRefresh();
0 条评论
下一页