标签:容器 BeanFactory Spring 初始化 Bean 方法 IOC
IOC是Spring整体核心,其他模块其实都是依赖IOC
IOC 控制反转 解决层层之间 耦合问题
IOC容器加载过程:(重要)
BeanFactory Spring顶层核心接口 简单工厂模式 getBean()(可以获取Bean和生产Bean);ApplicationContext实现了BeanFactory,管理Spring的生命周期
基于xml ClassPathXmlApplicationContext
基于注解 AnnocationApplicationContext
BeanDefinition(bean定义)封装了生产了bean的原料,放在BeanDefinitionMap里
BeanDefinitionReader读取配置类
BeanDefinitionScanner扫描有效配置类
BeanDefinitionRegistry注册Bean,注册到BeanDefinition中
Bean的生命周期:整个过程中会调用9次Bean后置处理器
1.实例化,此时只是一个空壳 反射(Spring控制实例化,通过无参构造(默认),有参构造),工厂方法(自己控制@Bean)
2.填充属性 (@Autofwired @Value)
3.初始化,放在map<beanName,bean实例>,这个map是一级缓存(单例池),在初始化过程中,会调用很多Aware方法,如BeanNameAware,BeanClassLoaderAware,BeanFactoryAware等以及初始化回调:@PostConstruct标记的方法,initial lizingBean接口,initMethod方法
扩展点:
Bean工厂后置处理器BeanFactoryPostProcessor 修改Bean定义;
BeanDefinitionRegistryPostProcessor注册Bean定义;
Bean的后置处理器BeanPostProcessor;
场景:集成其它框架
AOP创建代理是在Bean生命周期完成之后,也就是初始化之后,通过PostProcessAfterInitialization实现
Spring循环依赖(A依赖B,B依赖A),通过三级缓存(就是3个map)解决
个人总结:
IOC加载过程:
首先,我们的类要生产成一个Bean,不是一步到位的
先要将类加载成Bean定义,主要步骤是通过BeanDefinitionReader读取配置类,通过BeanDefinitionScanner扫描合格的配置类,通过BeanDefinitionRegisty注册Bean定义
Spring提供了BeanFactoryPostProcessor修改Bean定义和BeanDefinitionRegistryPostProcessor注册Bean定义的扩展节点
使用BeanFactory的getBean()方法来生产bean,判断是否符合生产标准(是不是FactoryBean,不是的话从一级缓存拿,拿到就返回,没有拿到调用createBean()方法),
接着(Bean生命周期,总共调用9次Bean的后置处理器)
1.实例化,此时只是一个空壳 反射(Spring控制实例化,通过无参构造(默认),有参构造),工厂方法(自己控制@Bean)
2.填充属性 (@Autofwired @Value)
3.初始化,放在map<beanName,bean实例>,这个map是一级缓存(单例池),在初始化过程中,会调用很多Aware方法,如BeanNameAware,BeanClassLoaderAware,BeanFactoryAware等以及初始化回调:@PostConstruct标记的方法,initial lizingBean接口,initMethod方法
最后放入一级缓存中(singletonObjects)
1.拿到BeanFactory 是DefaultListableBeanFactory
2.注册一些后置处理器,如:ConfigurationClassPostProcessor解析配置类(重要)(在reader中注册)
3.reader,scanner,registry
4.refresh()方法 ===> 最核心的方法 里面有13个方法
这个方法会优先创建创世纪的后置处理器
BeanFactory和FactoryBean区别:
BeanFactory是spring顶层核心接口 可以生产bean
FactoryBean:当一个bean实现FactoryBean,重写getObject方法,可以指定生成什么类型的Bean,比如Car实现FactoryBean,可以在getObject()方法中返回Tank
标签:容器,BeanFactory,Spring,初始化,Bean,方法,IOC 来源: https://blog.csdn.net/m0_46225296/article/details/121639930
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。