spring ioc初始化
2019-07-25 10:07:04 3 举报
spring ioc
作者其他创作
大纲/内容
beanfactory是懒加载,applicationcontext是饿汉式加载
如果是factorybean(要加&前缀获取factorybean,否则获取的是getObject方法返回的实例)
obtainFreshBeanFactory()获取ConfigurableListableBeanFactory
1.原型模式的Bean发生循环引用,则直接不处理2.创建bean,如果获取BeanPostProcessor代理对象(代理类的生成)没有生产则创建bean。三种情况:1.通过工厂方法去创建Bean的实例2.参数化构造方法3.无参构造方法(反射生成对象)
DefaultSingletonBeanRegistry#getSingleton():先从一级缓存singletonObjects获取对象,如果没有从二级缓存earlySingletonObjects获取,否则从三级缓存singletonFactories获取(三级缓存会通过方法去创建对象)。
不是factorybean
// bean初始化第二步:填充属性(DI依赖注入发生在此步骤) // 调用反射和内省去进行属性设置 // 属性值需要进行类型转换populateBean
a) 创建IoC容器(DefaultListableBeanFactory) b) 加载解析XML文件将资源文件转为InputStream的IO流(最终存储到Document对象中) c) 读取Document对象,并完成BeanDefinition的加载和注册工作(DefaultBeanDefinitionDocumentReader#parseBeanDefinitions)(是否使用了Spring默认的XML命名空间1.)TODO
如果取出来的Bean实例是FactoryBean的Bean实例,则需要从FactoryBean实例中产生一个对象实例
factorybean是为了解决复杂bean初始化的需求
是否存在
finishBeanFactoryInitialization(遍历beannames实例化剩余的单例bean(如果bean不是抽象的,而且是单例的,同时还不是懒加载的)注意事项:Bean的IoC、DI和AOP都是发生在此步骤)
prepareBeanFactory(对IoC容器进行一些预处理(设置一些公共属性))TODO
ClassPathXmlApplicationContext
postProcessBeanFactory(留给自定义使用)
initApplicationEventMulticaster(初始化应用事件广播器)onRefresh(初始化一些特殊的bean)registerListeners(注册一些监听器)
registerBeanPostProcessors(注册BeanPostProcessor后置处理器)
否
prepareRefresh()删除原有容器,创建新容
如果需要提前暴露则,放入三级缓存(此时这个bean还未初始化只是实例化完成)
initMessageSource(初始化一些消息源(比如处理国际化的i18n等消息源))
initializeBean(初始化实例)1、应用BeanPostProcessor的postProcessBeforeInitialization方法2、执行初始化方法(先调用InitializingBean的afterPropertiesSet,再调用init-method属性指定的初始化方法)3、应用BeanPostProcessor的postProcessAfterInitialization方法(AOP代理对象生成)
refresh()器
invokeBeanFactoryPostProcessors(典型应用:读取配置信息)
是
反射:1.Class<?> cls = Class.forName(\"cn.mldn.demo.Person\
收藏
0 条评论
回复 删除
下一页