-
bean定义子元素
-
lookup-method
获取器注入,配置一个获取某个get bean的 abstract 方法的实际返回值
-
replaced-method
可以在运行时调用新的方法替换现有方法,还能动态更新现有方法的实现逻辑
-
-
自定义标签解析器,根据不同的标签使用对应的解析器(工厂方法 BeanDefinitionParser.parse())
- advice TxAdviceBeanDefinitionParser
- annotation-driven AnnotationDrivenBeanDefinitionParser
- jta-transaction-manager JtaTransactionManagerBeanDefinitionParser
- property-placeholder PropertyPlaceholderBeanDefinitionParser
- property-override PropertyOverrideBeanDefinitionParser
- annotation-config AnnotationConfigBeanDefinitionParser
- component-scan ComponentScanBeanDefinitionParser
- load-time-weaver LoadTimeWeaverBeanDefinitionParser
- spring-configured SpringConfiguredBeanDefinitionParser
- mbean-export MBeanExportBeanDefinitionParser
- mbean-server MBeanServerBeanDefinitionParser
-
循环依赖
-
两个或两个以上bean互相引用,形成闭环;
spring将bean的创建分三个过程:创建实例(构造器、工厂方法实现)、属性填充(注入)、调用初始化方法init-method;
-
singleton bean三级缓存
- singletonFactories 三级缓存单例对象工厂(FactoryBean)cache,重写getObject(),返回bean
- earlySingletonObjects 二级缓存提前曝光的单例对象cache
- singletonObjects 一级缓存单例对象cache
-
构造器循环依赖(Spring解决不了,抛出异常)
A的构造器参数依赖B,B的构造器参数依赖A;在A创建实例时会先初始化依赖B,初始化B是又去初始A,造成循环依赖
-
setter循环依赖(三级缓存)
A属性依赖B,B属性依赖A;A创建实例后将Spring将A的FactoryBean放入三级缓存singletonFactories,
之后进行属性填充,发现存在属性依赖B,前去获取创建B创建实例后同样将B放入三级缓存singletonFactories中,
之后进行属性填充,发现存在依赖A,获取A时从singletonFactories获取到A的FactoryBean,通过FactoryBean
获取到A的实例引用,属性填充完成,B创建完成,A获取到B的实例引用,创建完成
-
-
自动装箱
- 在创建bean的三个过程中,当创建实例(构造器、工厂方法实现)后会执行applyMergedBeanDefinitionPostProcessors(),
遍历所有BeanPostProcessors执行postProcessMergedBeanDefinition(),每种BeanPostProcessor根据不同的注解
去查找bean的属性进行自动封装- AutowiredAnnotationBeanPostProcessor @Autowire @Value
- CommonAnnotationBeanPostProcessor @Resource
- RequiredAnnotationBeanPostProcessor @Required
- 在创建bean的三个过程中,当创建实例(构造器、工厂方法实现)后会执行applyMergedBeanDefinitionPostProcessors(),
-
bean初始化流程
-
遍历 beanDefinitionNames 解析过的 beanDefinition --> DefaultListableBeanFactory.preInstantiateSingletons()
-
AbstractBeanFactory.getBean(beanName)
-
AbstractBeanFactory.doGetBean(final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)
-
获取缓存中提前曝光的 ObjectFactory sharedInstance = AbstractBeanFactory.getSingleton(beanName)
- 从一级缓存 singletonObjects 中获取
- singletonObjects 中获取不到 从二级缓存 earlySingletonObjects 中获取
- earlySingletonObjects 中获取不到 从三级缓存 singletonFactories 中获取
- singletonFactories 中获取后删除 移到二级缓存 earlySingletonObjects
-
sharedInstance != null 执行bean的获取 AbstractBeanFactory.getObjectForBeanInstance(sharedInstance, name, beanName, null)
- 如果 sharedInstance 不是 FactoryBean 直接返回
- 从 FactoryBean 获取到的 bean 的缓存 factoryBeanObjectCache 获取bean
- FactoryBeanObjectCache 中获取不到 将 sharedInstance 转成 FactoryBean 获取 bean
- 将 (FactoryBean)sharedInstance 获取到的 bean 放入 FactoryBeanObjectCache
- 过程中 如果 factoryBeanObjectCache 或 FactoryBean 获取到bean 执行 postProcessObjectFromFactoryBean(object, beanName)
-
sharedInstance == null 执行bean的创建
- 返回父类 BeanFactory.getBean() 获取的到bean
- 递归整合包含父类的 RootBeanDefinition 遍历获取依赖 从 AbstractBeanFactory.getBean(beanName) 重新开始初始化流程
- AbstractAutowireCapableBeanFactory.createBean()
-
-
bean的作用域
- singleton:单例模式,容器中仅存一个,默认的
- prototype:多例模式,每次调用(getBean())都会创建新的实例
- request:每次http请求都会创建,仅适用于WebApplicationContext环境
- session:同一http session共享,仅适用于WebApplicationContext环境
- globalSession:用于portlet应用环境,仅适用于WebApplicationContext环境