百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
2025/1/11 6:03:16
本文主要是介绍百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
dispatcherServlet 图片
AbstractApplicationContext
//初始化所有剩余的单例Bean // 当工厂初始化完成的时候, finishBeanFactoryInitialization(beanFactory);
它在判断它是不是“延时加载”,如果不是“延时加载”才给它注入
DefaultListableBeanFactory
加载。
//对配置lazy-init属性单态Bean的预实例化 @Override public void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("Pre-instantiating singletons in " + this); } // Iterate over a copy to allow for init methods which in turn register new bean definitions. // While this may not be part of the regular factory bootstrap, it does otherwise work fine. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); // Trigger initialization of all non-lazy singleton beans... for (String beanName : beanNames) { //获取指定名称的Bean定义 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); //Bean不是抽象的,是单态模式的,且lazy-init属性配置为false if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { //如果指定名称的bean是创建容器的Bean if (isFactoryBean(beanName)) { //FACTORY_BEAN_PREFIX=”&”,当Bean名称前面加”&”符号 //时,获取的是产生容器对象本身,而不是容器产生的Bean. //调用getBean方法,触发容器对Bean实例化和依赖注入过程 final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName); //标识是否需要预实例化 boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { //一个匿名内部类 isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> ((SmartFactoryBean<?>) factory).isEagerInit(), getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } if (isEagerInit) { //调用getBean方法,触发容器对Bean实例化和依赖注入过程 getBean(beanName); } } else { getBean(beanName); } } } // Trigger post-initialization callback for all applicable beans... for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); if (singletonInstance instanceof SmartInitializingSingleton) { final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> { smartSingleton.afterSingletonsInstantiated(); return null; }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); } } } }
BeanFactory:主语是 Factory(顶层接口)
具体的工厂会通过 策略模式 去实现,不同的工厂生产不同的产品
FactoryBean:主语是 Bean,所有工厂生产的产品都要实现此接口
简言之:BeanFactory 生产出来的产品都是 FactoryBean 。
大部分情况下,BeanFactory 本身也是通过 BeanFactory 创建的,也就是说 BeanFactory 也是一个 FactoryBean。
策略模式是我们预设好的创建者模型,我们选用什么样的策略是由用户来决定,这个工厂本身我是不知道调用什么方法去创建对象的。我要根据用户的配置去把这个配置搞出来,这个工厂本身是一个单例,所以 BeanFactory 也是要由 BeanFactory 来创建的。
BeanFactory 和 FactoryBean
"&" 区别 BeanFactory。
Beanname
和 Instance
。
key
和 value
。
Java在中 所有东西都是对象,Spring 中所有都是 FactoryBean。 异曲同工 。
Spring 中的 Bean 初始化之前和之后,都会有一个处理。
它有一个配置文件,来决定它用哪个工厂。
来源于: https://javaguide.net
微信公众号:不止极客
这篇关于百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?
- 2025-01-10实现精准执行:团队协作新方法