主页

【理解Spring】Bean 创建

在 BeanFactory.getBean() 中,如果从单例池没有获取到 Bean,则创建 Bean 代码入口: AbstractAutowireCapableBeanFactory.createBean(String beanName, RootBeanDefinition, Object[] args) Central method of this class: creates a bean instance, populates the bean instance, applies post-processors, etc. 此方法主要目的:创建 Bean 实例,填充 Bean 实例,应用/执行 Post-Processor 等 代码调用: Abstra...

阅读更多

【理解Spring】BeanFactory.getBean()

代码入口:DefaultListableBeanFactory.preInstantiateSingletons() Spring 在合并 BeanDefinition 之后,调用 AbstractBeanFactory.getBean() 获取 Bean AbstractBeanFactory.getBean() 有许多重载方法,其最终调用的是 protected <T> T doGetBean( final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheck...

阅读更多

【理解Spring】BeanDefinition 继承

BeanDefinition 可以通过继承获得父 BeanDefinition 的属性,开发中实际运用的比较少。 非继承: <bean id="parent" class="com.azh3ng.service.Parent" cope="prototype"/> <bean id="child" class="com.azh3ng.service.Child"/> 上述情况下,child 是单例 Bean。 继承 BeanDefinition: <bean id="parent" class="com.azh3ng.service.Parent" cope="prototype"/> <bean id="child" class=...

阅读更多

【理解Spring】抽象 BeanDefinition

抽象的 BeanDefinition 不会生成 Bean,由于 BeanDefinition 有继承关系(BeanDefinition继承),所以可以定义抽象 BeanDefinition 作为其他 BeanDefinition 的父级,其中定义的属性(scope、lazy 等)可以作用到子级的 BeanDefinition 定义抽象 BeanDefinition spring.xml <bean id="user" class="com.demo.User" abstract="true"/>

阅读更多

【理解Spring】合并 BeanDefinition

代码入口: AbstractBeanFactory.getMergedBeanDefinition() 通过 Bean Name 从缓存获取合并后的 BeanDefinition,如果为空,根据 BeanDefinition继承 关系,判断是否有父级 BeanDefinition,有则递归向上找父级 BeanDefinition,并向下合并,子 BeanDefinition 的属性继承自父级 BeanDefinition,如果子级的属性不为空则覆盖父级的属性,生成 RootBeanDefinition,得到完整的 BeanDefinition。 将合并后的 RootBeanDefinition 加入缓存 AbstractBeanFactory.mergedBeanDefinitions

阅读更多

【理解Spring】Spring初始化所有非懒加载单例Bean

代码入口: org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons @Override public void preInstantiateSingletons() throws BeansException { if (logger.isTraceEnabled()) { logger.trace("Pre-instantiating singletons in " + this); } // Iterate over a copy to allow for init methods which i...

阅读更多

【理解Spring】扫描

Spring 启动的时候会调用 ClassPathBeanDefinitionScanner.scan(String... basePackages) ClassPathBeanDefinitionScanner.doScan(String... basePackages) ClassPathScanningCandidateComponentProvider.findCandidateComponents() ClassPathScanningCandidateComponentProvider.scanCandidateComponents() 扫描某个包路径,筛...

阅读更多

【理解Spring】Spring启动

概览 通常所说的 Spring 启动,就是构造 ApplicationContext 对象以及调用 refresh() 方法的过程,其中最核心的内容是 调用BeanFactoryPostProcessors 和 解析配置类。 Spring 启动过程主要执行了: 构造一个 BeanFactory 对象 解析配置类,得到 BeanDefinition,并注册到 BeanFactory 中 解析 @ComponentScan,并完成扫描 解析 @Import 解析 @Bean … 初始化 MessageSource 对象(ApplicationContext 支持国际化) 初始化 Applicati...

阅读更多