【理解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...
共计 47 篇文章,6 页。