当前位置:   article > 正文

spring bean生命周期二---Spring Bean实例化( Instantiation)阶段_mbd.issynthetic()

mbd.issynthetic()

目录

一、这里涉及几个比较重要的后置处理器:

1、InstantiationAwareBeanPostProcessor :

2、martInstantiationAwareBeanPostProcessor 后置处理器:

3、SmartInstantiationAwareBeanPostProcessor后置处理器

4、InstantiationAwareBeanPostProcessor初始化后置处理器

二、Bean实例化详细流程

三、Spring Bean 实例化前阶段

第一次调用后置处理器

 3.1、自己实现 (这个在开发过程几乎用不到)

3.2、spring 内置的实现  (主要作用是判断 bean是否需要被代理 ,需要被代理的类 就放入map中)

四、Spring Bean 实例化阶段

4.1、第二次调用后置处理器推断构造方法 

4.2、instantiateBean(beanName, mbd)使用默认无参构造器实例化对象

4.3、使用依赖注入的构造器实例化对象:autowireConstructor(beanName, mbd, ctors, args)

五、处理合并BeanDefinition与解决循环依赖后置处理器

5.1、第三调用后置处理器MergedBeanDefinitionPostProcessor

5.2、第四次调用后置处理器 解决循环依赖提前暴露一个工厂

六、spring bean实例化后置阶段

6.1、第五次调用后置处理器 :属性是否注入InstantiationAwareBeanPostProcessor

6.2、测试实例 

总结:


经过上一篇的BeanDefinition 生成过程后,已经得到实例化bean的相关的源信息,这一篇重点介绍spring bean的实例化的过程,也就是我们通常的创建对象,不过这样需要推断构造器,使用反射实例化对象。

此阶段主要包括: Spring Bean 实例化前阶段、Spring Bean 实例化阶段、Spring Bean 实例化后阶段等阶段

 

一、这里涉及几个比较重要的后置处理器:

1、InstantiationAwareBeanPostProcessor :

  • Spring Bean 实例化前阶段:      第一次调用后置处理器   postProcessBeforeInstantiation 方法  默认实现是判断是否需要代理放入map中
  • Spring Bean  实例化后置阶段:   第五次调用后置处理器   postProcessAfterInstantiation方法          属性赋值(Populate)判断是否需要属性填充
  • populateBean属性赋值 :             第六次调用后置处理器:postProcessPropertyValues                为bean填充属性包括依赖注入的属性

2、martInstantiationAwareBeanPostProcessor 后置处理器:

        第二次调用后置处理器determineCandidateConstructors获取最优构造方法实例化对象

3、SmartInstantiationAwareBeanPostProcessor后置处理器

            第四次调用后置处理器getEarlyBeanReference解决循环依赖的问题

4、InstantiationAwareBeanPostProcessor初始化后置处理器

  • Spring Bean 初始化前阶段 postProcessBeforeInitialization
  • Spring Bean 初始化后阶段:postProcessAfterInitialization

    在实例化阶段主要涉及 1到3 后置处理器 如下图:

二、Bean实例化详细流程

相关入口:

  • 根据类型获取Bean
    org.springframework.context.support.AbstractApplicationContext.getBean(Class<T>)
  • 根据名字获取Bean
    org.springframework.context.support.AbstractApplicationContext.getBean(String)
  • 实际获取Bean
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean
  • 根据给出的Bean获取真实Bean(可能是factoryBean)
    org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance
  • 创建Bean
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean
  • 实际创建Bean
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean

下面是 的相关源码

AbstractApplicationContext.finishBeanFactoryInitialization()实例化bean入口方法

 

  1. //创建Bean实例对象
  2. @Override
  3. protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
  4. throws BeanCreationException {
  5. if (logger.isDebugEnabled()) {
  6. logger.debug("Creating instance of bean '" + beanName + "'");
  7. }
  8. RootBeanDefinition mbdToUse = mbd;
  9. //判断需要创建的Bean是否可以实例化,即是否可以通过当前的类加载器加载
  10. Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
  11. if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
  12. mbdToUse = new RootBeanDefinition(mbd);
  13. mbdToUse.setBeanClass(resolvedClass);
  14. }
  15. // 校验和准备Bean中的方法覆盖
  16. try {
  17. mbdToUse.prepareMethodOverrides();
  18. }
  19. catch (BeanDefinitionValidationException ex) {
  20. throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
  21. beanName, "Validation of method overrides failed", ex);
  22. }
  23. try {
  24. //如果Bean配置了初始化前和初始化后的处理器,则试图返回一个需要创建Bean的代理对象
  25. //TODO 第一次调用bean的后置处理器 主要判断bean需要被代理 bean一般都为空
  26. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  27. if (bean != null) {
  28. return bean;
  29. }
  30. }
  31. catch (Throwable ex) {
  32. throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
  33. "BeanPostProcessor before instantiation of bean failed", ex);
  34. }
  35. try {
  36. //创建Bean的入口
  37. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
  38. if (logger.isDebugEnabled()) {
  39. logger.debug("Finished creating instance of bean '" + beanName + "'");
  40. }
  41. return beanInstance;
  42. }
  43. catch (BeanCreationException ex) {
  44. // A previously detected exception with proper bean creation context already...
  45. throw ex;
  46. }
  47. catch (ImplicitlyAppearedSingletonException ex) {
  48. // An IllegalStateException to be communicated up to DefaultSingletonBeanRegistry...
  49. throw ex;
  50. }
  51. catch (Throwable ex) {
  52. throw new BeanCreationException(
  53. mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
  54. }
  55. }

三、Spring Bean 实例化前阶段

第一次调用后置处理器

非主流生命周期 -- Bean 实例化前阶段:InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

 3.1、自己实现 (这个在开发过程几乎用不到)

自己实现后置处理器的postProcessBeforeInstantiation 方法替换把配置完成的 superUser bean覆盖。重新生成一个superUser bean。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. https://www.springframework.org/schema/context/spring-context.xsd">
  10. <!-- <context:annotation-config/>-->
  11. <!-- <context:component-scan base-package="org.acme" />-->
  12. <!-- Root BeanDefinition 不需要合并,不存在 parent -->
  13. <!-- 普通 beanDefinition GenericBeanDefinition -->
  14. <!-- 经过合并后 GenericBeanDefinition 变成 RootBeanDefinition -->
  15. <bean id="user" class="org.geekbang.thinking.in.spring.ioc.overview.domain.User">
  16. <property name="id" value="1"/>
  17. <property name="name" value="小马哥"/>
  18. <property name="city" value="HANGZHOU"/>
  19. <property name="workCities" value="BEIJING,HANGZHOU"/>
  20. <property name="lifeCities">
  21. <list>
  22. <value>BEIJING</value>
  23. <value>SHANGHAI</value>
  24. </list>
  25. </property>
  26. <property name="configFileLocation" value="classpath:/META-INF/user-config.properties"/>
  27. </bean>
  28. <!-- 普通 beanDefinition GenericBeanDefinition -->
  29. <!-- 合并后 GenericBeanDefinition 变成 RootBeanDefinition,并且覆盖 parent 相关配置-->
  30. <!-- primary = true , 增加了一个 address 属性 -->
  31. <bean id="superUser" class="org.geekbang.thinking.in.spring.ioc.overview.domain.SuperUser" parent="user"
  32. primary="true">
  33. <property name="address" value="杭州"/>
  34. </bean>
  35. </beans>
  1. public class BeanInstantiationDemo {
  2. public static void main(String[] args) {
  3. DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
  4. // 方法一:添加 BeanPostProcessor 实现 MyInstantiationAwareBeanPostProcessor
  5. beanFactory.addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessorDome());
  6. XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
  7. String location = "META-INF/dependency-lookup-context.xml";
  8. Resource resource = new ClassPathResource(location);
  9. // 指定字符编码 UTF-8
  10. EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
  11. beanDefinitionReader.loadBeanDefinitions(encodedResource);
  12. // 通过 Bean Id 和类型进行依赖查找
  13. User user = beanFactory.getBean("user", User.class);
  14. System.out.println(user);
  15. User superUser = beanFactory.getBean("superUser", User.class);
  16. System.out.println(superUser);
  17. }
  18. /**
  19. * 实现 后置处理器
  20. */
  21. static class MyInstantiationAwareBeanPostProcessorDome implements InstantiationAwareBeanPostProcessor {
  22. @Override
  23. public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  24. if(ObjectUtils.nullSafeEquals("superUser",beanName) && SuperUser.class.equals(beanClass)){
  25. //把配置完成的 superUser bean覆盖
  26. return new SuperUser();
  27. }
  28. return null;//这里表示什么都不变化
  29. }
  30. }
  31. }

执行日志。我们可以看到 SuperUser 只是实例化了 ,什么属性都没有填充

User{id=1, name='小马哥', city=HANGZHOU, workCities=[BEIJING, HANGZHOU], lifeCities=[BEIJING, SHANGHAI], configFileLocation=class path resource [META-INF/user-config.properties], company=null, context=null, contextAsText='null', beanName='user'}
SuperUser{address='null'} User{id=null, name='null', city=null, workCities=null, lifeCities=null, configFileLocation=null, company=null, context=null, contextAsText='null', beanName='null'}
 

3.2、spring 内置的实现  (主要作用是判断 bean是否需要被代理 ,需要被代理的类 就放入map中)

代码位置:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation(beanName, mbdToUse)

  1. @Nullable
  2. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  3. Object bean = null;
  4. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  5. // Make sure bean class is actually resolved at this point.
  6. //TODO mbd.isSynthetic() 表示是否合成类
  7. // hasInstantiationAwareBeanPostProcessors() 判断系统是否有 InstantiationAwareBeanPostProcessors
  8. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  9. Class<?> targetType = determineTargetType(beanName, mbd);
  10. if (targetType != null) {
  11. //这个一般都是为空
  12. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
  13. if (bean != null) {
  14. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
  15. }
  16. }
  17. }
  18. mbd.beforeInstantiationResolved = (bean != null);
  19. }
  20. return bean;
  21. }
  22. protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  23. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  24. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  25. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  26. Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
  27. if (result != null) {
  28. return result;
  29. }
  30. }
  31. }
  32. return null;
  33. }

主要实现类就一个AbstractAutoProxyCreator#postProcessBeforeInstantiation

主要作用是判断 bean是否需要被代理 ,需要被代理的类 就放入map中

  1. @Override
  2. public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  3. Object cacheKey = getCacheKey(beanClass, beanName);
  4. if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
  5. //advisedBeans 不需要被代理的对象
  6. if (this.advisedBeans.containsKey(cacheKey)) {
  7. return null;
  8. }
  9. if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
  10. this.advisedBeans.put(cacheKey, Boolean.FALSE);
  11. return null;
  12. }
  13. }
  14. // Create proxy here if we have a custom TargetSource.
  15. // Suppresses unnecessary default instantiation of the target bean:
  16. // The TargetSource will handle target instances in a custom fashion.
  17. TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
  18. if (targetSource != null) {
  19. if (StringUtils.hasLength(beanName)) {
  20. this.targetSourcedBeans.add(beanName);
  21. }
  22. Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
  23. Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
  24. this.proxyTypes.put(cacheKey, proxy.getClass());
  25. return proxy;
  26. }
  27. return null;
  28. }

四、Spring Bean 实例化阶段

实例化阶段主要是 根据后置处理器 推断出 实例化bean的最优构造方法,实例化对象。

第二次调用bean的后置处理器:推断实例化构造方法---》SmartInstantiationAwareBeanPostProcessor #determineCandidateConstructors

路径:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance(beanName, mbd, args)

接口:SmartInstantiationAwareBeanPostProcessor #determineCandidateConstructors(Class<?> beanClass, String beanName)

实现类:AutowiredAnnotationBeanPostProcessor #determineCandidateConstructors

这个后置处理器 需要实现 SmartInstantiationAwareBeanPostProcessor接口

 

实例化方式:

   1、使用默认无参构造器:instantiateBean(beanName, mbd)

             实例化策略 - InstantiationStrategy--- instantiationStrategy = new CglibSubclassingInstantiationStrategy()---- SimpleInstantiationStrategy   

   2、使用依赖注入的构造器:autowireConstructor(beanName, mbd, ctors, args)

createBeanInstance 代码实现
  1. //创建Bean的实例对象
  2. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
  3. // Make sure bean class is actually resolved at this point.
  4. //检查确认Bean是可实例化的
  5. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  6. //使用工厂方法对Bean进行实例化
  7. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  8. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  9. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
  10. }
  11. //todo 这个程序员自己提供创建对象的方法
  12. // 这里使用自己提供的 方法实例化对象, 不需要spring推断构造方法区实例化bean
  13. // genericBeanDefinition.setInstanceSupplier(() -> new IndexService(beanFactory.getBean(OrderSevice.class)));
  14. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  15. if (instanceSupplier != null) {
  16. return obtainFromSupplier(instanceSupplier, beanName);
  17. }
  18. //todo 这个程序员自己提供创建对象的工厂方法 factory-method
  19. if (mbd.getFactoryMethodName() != null) {
  20. //调用工厂方法实例化
  21. return instantiateUsingFactoryMethod(beanName, mbd, args);
  22. }
  23. // Shortcut when re-creating the same bean...
  24. //TODO 下面是重点 开始创建bean 使用容器的自动装配方法进行实例化
  25. //表示创建对象的构造方法没有被解析过
  26. boolean resolved = false;
  27. //是否需要自动注入
  28. boolean autowireNecessary = false;
  29. //args 一般都为空
  30. if (args == null) {
  31. synchronized (mbd.constructorArgumentLock) {
  32. //Todo 下面很重要 如果不为空 表示这个class 方法被解析过了 表示已经找到了创建对象的方式
  33. // 一般在原型模式中 使用 快捷方式,不需要再次解析构造方法
  34. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  35. resolved = true;
  36. autowireNecessary = mbd.constructorArgumentsResolved;
  37. }
  38. }
  39. }
  40. if (resolved) {
  41. if (autowireNecessary) {
  42. //配置了自动装配属性,使用容器的自动装配实例化
  43. //容器的自动装配是根据参数类型匹配Bean的构造方法
  44. return autowireConstructor(beanName, mbd, null, null);
  45. }
  46. else {
  47. //使用默认的无参构造方法实例化
  48. return instantiateBean(beanName, mbd);
  49. }
  50. }
  51. // Need to determine the constructor...
  52. //TODO 第二次调用后置处理器推断构造方法 下面是单例对象的 使用Bean的构造方法进行实例化
  53. //找到 class 构造方法 特殊的算法
  54. /* TODO spring 通过构造方法实例化 bean的原理
  55. 实例化这个对象---首先要推断构造方法
  56. 这个分两种类型
  57. 1、手动注入
  58. 会在后置处理器中 找到实现 SmartInstantiationAwareBeanPostProcessor接口的类型
  59. AutowiredAnnotationBeanPostProcessor类中的determineCandidateConstructors 方法来推断出
  60. 合适的构造方法创建对象
  61. 1.1、只有一个无参构造方法 ctors为 null 使用默认无参构造方法
  62. 1.2 如果有多个构造方法 ctors为 null 使用默认无参构造方法
  63. 1.3 如果只有一个有参构造方法 ctors不为null 因为只有一个有参数的 只能用这个了
  64. 1.4、多个构造方法 且只有一个构造方法加了@Autowired(required = true) 用这个构造方法来创建对象
  65. 1.5、多个构造方法 且多个构造方法加了@Autowired(required = true) spring ioc容器报错
  66. 1.6、多个构造方法 且多个构造方法加了@Autowired(required = false) 就把构造方法都加到集合中 第二次推断
  67. 2、自动注入 --通过构造方法自动注入
  68. 2.1、如果有多个构造方法 找出最优的构造器 参数最多的 为最优的
  69. */
  70. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  71. if (ctors != null ||
  72. mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || //这个表示自动装配
  73. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  74. //使用容器的自动装配特性,调用匹配的构造方法实例化
  75. //使用推断出来的构造方法找到一个可以用的 实例化bean
  76. return autowireConstructor(beanName, mbd, ctors, args);
  77. }
  78. // No special handling: simply use no-arg constructor.
  79. //使用默认的无参构造方法实例化
  80. return instantiateBean(beanName, mbd);
  81. }

4.1、第二次调用后置处理器推断构造方法 

接口:SmartInstantiationAwareBeanPostProcessor #determineCandidateConstructors(Class<?> beanClass, String beanName)

实现类:AutowiredAnnotationBeanPostProcessor #determineCandidateConstructors

其中推断构造器的规则

这个分两种类型
   1、手动注入
             合适的构造方法创建对象
             1.1、只有一个无参构造方法 ctors为 null 使用默认无参构造方法
             1.2 如果有多个构造方法 ctors为 null 使用默认无参构造方法
             1.3  如果只有一个有参构造方法 ctors不为null 因为只有一个有参数的 只能用这个了
             1.4、多个构造方法 且只有一个构造方法加了@Autowired(required = true) 用这个构造方法来创建对象
             1.5、多个构造方法 且多个构造方法加了@Autowired(required = true)  spring ioc容器报错
             1.6、多个构造方法 且多个构造方法加了@Autowired(required = false)  就把构造方法都加到集合中 第二次推断

2、自动注入 --通过构造方法自动注入
             2.1、如果有多个构造方法  找出最优的构造器 参数最多的为最优的

             2.2、多个构造方法 且只有一个构造方法加了@Autowired(required = true) 用这个构造方法来创建对象
             2.3、多个构造方法 且多个构造方法加了@Autowired(required = true)  spring ioc容器报错

代码实现:

  1. protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
  2. throws BeansException {
  3. if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
  4. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  5. // AutowiredAnnotationBeanPostProcessor 这个后置处理 实现了 SmartInstantiationAwareBeanPostProcessor
  6. if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
  7. SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
  8. //TODO 推断构造器 AutowiredAnnotationBeanPostProcessor
  9. Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
  10. if (ctors != null) {
  11. return ctors;
  12. }
  13. }
  14. }
  15. }
  16. return null;
  17. }

实现类:AutowiredAnnotationBeanPostProcessor #determineCandidateConstructors

  1. //TODO 为自动依赖注入装配Bean选择合适的构造方法
  2. @Override
  3. @Nullable
  4. public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName)
  5. throws BeanCreationException {
  6. // Let's check for lookup methods here..
  7. if (!this.lookupMethodsChecked.contains(beanName)) {
  8. try {
  9. ReflectionUtils.doWithMethods(beanClass, method -> {
  10. Lookup lookup = method.getAnnotation(Lookup.class);
  11. if (lookup != null) {
  12. Assert.state(beanFactory != null, "No BeanFactory available");
  13. LookupOverride override = new LookupOverride(method, lookup.value());
  14. try {
  15. RootBeanDefinition mbd = (RootBeanDefinition) beanFactory.getMergedBeanDefinition(beanName);
  16. mbd.getMethodOverrides().addOverride(override);
  17. }
  18. catch (NoSuchBeanDefinitionException ex) {
  19. throw new BeanCreationException(beanName,
  20. "Cannot apply @Lookup to beans without corresponding bean definition");
  21. }
  22. }
  23. });
  24. }
  25. catch (IllegalStateException ex) {
  26. throw new BeanCreationException(beanName, "Lookup method resolution failed", ex);
  27. }
  28. this.lookupMethodsChecked.add(beanName);
  29. }
  30. //首先从容器的缓存中查找是否有指定Bean的构造方法
  31. // Quick check on the concurrent map first, with minimal locking.
  32. // candidateConstructorsCache 这个 class的构造方法的map
  33. Constructor<?>[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);
  34. if (candidateConstructors == null) {
  35. // Fully synchronized resolution now...
  36. //线程同步以确保容器中数据一致性
  37. synchronized (this.candidateConstructorsCache) {
  38. candidateConstructors = this.candidateConstructorsCache.get(beanClass);
  39. if (candidateConstructors == null) {
  40. Constructor<?>[] rawCandidates;
  41. try {
  42. //通过JDK反射机制,获取指定类的中所有声明的构造方法
  43. rawCandidates = beanClass.getDeclaredConstructors();
  44. }
  45. catch (Throwable ex) {
  46. throw new BeanCreationException(beanName,
  47. "Resolution of declared constructors on bean Class [" + beanClass.getName() +
  48. "] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
  49. }
  50. //存放候选中合格的构造方法的集合
  51. List<Constructor<?>> candidates = new ArrayList<Constructor<?>>(rawCandidates.length);
  52. //autowire注解中required属性指定的构造方法
  53. Constructor<?> requiredConstructor = null;
  54. //默认的构造方法
  55. Constructor<?> defaultConstructor = null;
  56. //主构造方法 把推断的主要构造方法委托给 kotlin 非kotlin的类永远为空
  57. Constructor<?> primaryConstructor = BeanUtils.findPrimaryConstructor(beanClass);
  58. int nonSyntheticConstructors = 0;
  59. //遍历所有的构造方法,检查是否添加了autowire注解,以及是否指定了required属性
  60. for (Constructor<?> candidate : rawCandidates) {
  61. //判断是不是一个合成的类 一般不会进来
  62. if (!candidate.isSynthetic()) {
  63. nonSyntheticConstructors++;
  64. }
  65. else if (primaryConstructor != null) {
  66. continue;
  67. }
  68. //获取指定类中所有关于autowire的注解(Annotation)
  69. AnnotationAttributes ann = findAutowiredAnnotation(candidate);
  70. //如果指定类中没有antowire的注解
  71. if (ann == null) {
  72. Class<?> userClass = ClassUtils.getUserClass(beanClass);
  73. if (userClass != beanClass) {
  74. try {
  75. Constructor<?> superCtor =
  76. userClass.getDeclaredConstructor(candidate.getParameterTypes());
  77. ann = findAutowiredAnnotation(superCtor);
  78. }
  79. catch (NoSuchMethodException ex) {
  80. // Simply proceed, no equivalent superclass constructor found...
  81. }
  82. }
  83. }
  84. //如果指定类中有关于antowire的注解
  85. if (ann != null) {
  86. //如果antowire注解中指定了required属性
  87. if (requiredConstructor != null) {
  88. throw new BeanCreationException(beanName,
  89. "Invalid autowire-marked constructor: " + candidate +
  90. ". Found constructor with 'required' Autowired annotation already: " +
  91. requiredConstructor);
  92. }
  93. //获取autowire注解中required属性值
  94. boolean required = determineRequiredStatus(ann);
  95. //如果获取到autowire注解中required的属性值
  96. if (required) {
  97. //如果候选构造方法集合不为空
  98. if (!candidates.isEmpty()) {
  99. throw new BeanCreationException(beanName,
  100. "Invalid autowire-marked constructors: " + candidates +
  101. ". Found constructor with 'required' Autowired annotation: " +
  102. candidate);
  103. }
  104. //当前的构造方法就是required属性所配置的构造方法
  105. requiredConstructor = candidate;
  106. }
  107. //将当前的构造方法添加到哦啊候选构造方法集合中
  108. candidates.add(candidate);
  109. }
  110. //如果autowire注解的参数列表为空
  111. else if (candidate.getParameterCount() == 0) {
  112. defaultConstructor = candidate;
  113. }
  114. }
  115. //如果候选构造方法集合不为空
  116. if (!candidates.isEmpty()) {
  117. // Add default constructor to list of optional constructors, as fallback.
  118. //如果所有的构造方法都没有配置required属性,且有默认构造方法
  119. if (requiredConstructor == null) {
  120. if (defaultConstructor != null) {
  121. //将默认构造方法添加到候选构造方法列表
  122. candidates.add(defaultConstructor);
  123. }
  124. else if (candidates.size() == 1 && logger.isWarnEnabled()) {
  125. logger.warn("Inconsistent constructor declaration on bean with name '" + beanName +
  126. "': single autowire-marked constructor flagged as optional - " +
  127. "this constructor is effectively required since there is no " +
  128. "default constructor to fall back to: " + candidates.get(0));
  129. }
  130. }
  131. //将候选构造方法集合转换为数组
  132. candidateConstructors = candidates.toArray(new Constructor<?>[candidates.size()]);
  133. }
  134. //TODO 这里是判断构造方法 是否只有一个有参构造 如果一个有参构造则 为有效的构造方法
  135. else if (rawCandidates.length == 1 && rawCandidates[0].getParameterCount() > 0) {
  136. candidateConstructors = new Constructor<?>[] {rawCandidates[0]};
  137. }
  138. //下面两个都不成立 primaryConstructor != null
  139. else if (nonSyntheticConstructors == 2 && primaryConstructor != null && defaultConstructor != null) {
  140. candidateConstructors = new Constructor<?>[] {primaryConstructor, defaultConstructor};
  141. }
  142. else if (nonSyntheticConstructors == 1 && primaryConstructor != null) {
  143. candidateConstructors = new Constructor<?>[] {primaryConstructor};
  144. }
  145. else {
  146. //如果候选构造方法集合为空,则创建一个空的数组
  147. candidateConstructors = new Constructor<?>[0];
  148. }
  149. //将类的候选构造方法集合存放到容器的缓存中
  150. this.candidateConstructorsCache.put(beanClass, candidateConstructors);
  151. }
  152. }
  153. }
  154. //返回指定类的候选构造方法数组,如果没有返回null
  155. return (candidateConstructors.length > 0 ? candidateConstructors : null);
  156. }

4.2、instantiateBean(beanName, mbd)使用默认无参构造器实例化对象

当推断出来使用默认无参构造 

  1. //使用默认的无参构造方法实例化Bean对象
  2. protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
  3. try {
  4. Object beanInstance;
  5. final BeanFactory parent = this;
  6. //获取系统的安全管理接口,JDK标准的安全管理API
  7. if (System.getSecurityManager() != null) {
  8. //这里是一个匿名内置类,根据实例化策略创建实例对象
  9. beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
  10. getInstantiationStrategy().instantiate(mbd, beanName, parent),
  11. getAccessControlContext());
  12. }
  13. else {
  14. //将实例化的对象封装起来
  15. beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
  16. }
  17. BeanWrapper bw = new BeanWrapperImpl(beanInstance);
  18. initBeanWrapper(bw);
  19. return bw;
  20. }
  21. catch (Throwable ex) {
  22. throw new BeanCreationException(
  23. mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
  24. }
  25. }

4.3、使用依赖注入的构造器实例化对象:autowireConstructor(beanName, mbd, ctors, args)

使用条件:推断处理的 构造器方法不为null或者开启自动装配或者 使用指定入参的构造方法

  1. if (ctors != null ||
  2. mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || //这个表示自动装配
  3. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  4. //使用容器的自动装配特性,调用匹配的构造方法实例化
  5. //使用推断出来的构造方法找到一个可以用的 实例化bean
  6. return autowireConstructor(beanName, mbd, ctors, args);
  7. }

具有实现:ConstructorResolver#autowireConstructor 这里会再次推断构造方法实例化对象。

 

  1. public BeanWrapper autowireConstructor(final String beanName, final RootBeanDefinition mbd,
  2. @Nullable Constructor<?>[] chosenCtors, @Nullable final Object[] explicitArgs) {
  3. BeanWrapperImpl bw = new BeanWrapperImpl();
  4. this.beanFactory.initBeanWrapper(bw);
  5. //TODO 最后被确认使用的 构造方法
  6. Constructor<?> constructorToUse = null;
  7. //这里面存放的 构造方法的参数
  8. ArgumentsHolder argsHolderToUse = null;
  9. //最终确定的参数
  10. Object[] argsToUse = null;
  11. if (explicitArgs != null) {
  12. argsToUse = explicitArgs;
  13. }
  14. else {
  15. Object[] argsToResolve = null;
  16. synchronized (mbd.constructorArgumentLock) {
  17. //判断当前类 有没有解析构造方法 单例一般都为false
  18. constructorToUse = (Constructor<?>) mbd.resolvedConstructorOrFactoryMethod;
  19. //原型模式会走这个
  20. if (constructorToUse != null && mbd.constructorArgumentsResolved) {
  21. // Found a cached constructor...
  22. argsToUse = mbd.resolvedConstructorArguments;
  23. if (argsToUse == null) {
  24. argsToResolve = mbd.preparedConstructorArguments;
  25. }
  26. }
  27. }
  28. //转化 参数的属性值
  29. if (argsToResolve != null) {
  30. argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve);
  31. }
  32. }
  33. //这个单例模式的处理
  34. if (constructorToUse == null) {
  35. // Need to resolve the constructor.
  36. //判断是否需要自动注入
  37. boolean autowiring = (chosenCtors != null ||
  38. mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
  39. ConstructorArgumentValues resolvedValues = null;
  40. //构造方法参数个数的最小值
  41. int minNrOfArgs;
  42. //这个数根据传入参数做判断
  43. if (explicitArgs != null) {
  44. //表示实例spring 那个构造方法最少要多少
  45. minNrOfArgs = explicitArgs.length;
  46. }
  47. else {
  48. //获取构造方法的 参数
  49. ConstructorArgumentValues cargs = mbd.getConstructorArgumentValues();
  50. //
  51. resolvedValues = new ConstructorArgumentValues();
  52. //得到构造方法参数个数的最小值
  53. //todo 这个一般为0 除非在实例化的时候
  54. /*
  55. GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("indexService");
  56. genericBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue(beanFactory.getBean(UserServiceTest.class));
  57. */
  58. minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
  59. }
  60. // Take specified constructors, if any.
  61. //TODO 开始处理构造方法
  62. Constructor<?>[] candidates = chosenCtors;
  63. if (candidates == null) {
  64. Class<?> beanClass = mbd.getBeanClass();
  65. try {
  66. //拿到索引构造方法再次推断
  67. candidates = (mbd.isNonPublicAccessAllowed() ?
  68. beanClass.getDeclaredConstructors() : beanClass.getConstructors());
  69. }
  70. catch (Throwable ex) {
  71. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  72. "Resolution of declared constructors on bean Class [" + beanClass.getName() +
  73. "] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
  74. }
  75. }
  76. //todo 对构造方法进行排序
  77. // 排序规则 1、public 2、参数个数
  78. AutowireUtils.sortConstructors(candidates);
  79. //差异值
  80. int minTypeDiffWeight = Integer.MAX_VALUE;
  81. //模糊不清的构造方法
  82. Set<Constructor<?>> ambiguousConstructors = null;
  83. LinkedList<UnsatisfiedDependencyException> causes = null;
  84. for (Constructor<?> candidate : candidates) {
  85. Class<?>[] paramTypes = candidate.getParameterTypes();
  86. // TODO 最终使用的 如果找到一个就直接退出了 最重要的条件 argsToUse.length > paramTypes.length
  87. if (constructorToUse != null && argsToUse.length > paramTypes.length) {
  88. // Already found greedy constructor that can be satisfied ->
  89. // do not look any further, there are only less greedy constructors left.
  90. break;
  91. }
  92. if (paramTypes.length < minNrOfArgs) {
  93. continue;
  94. }
  95. //最后要使用的参数
  96. ArgumentsHolder argsHolder;
  97. if (resolvedValues != null) {
  98. //得到当前构造方法的参数名字
  99. try {
  100. String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, paramTypes.length);
  101. if (paramNames == null) {
  102. ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
  103. if (pnd != null) {
  104. paramNames = pnd.getParameterNames(candidate);
  105. }
  106. }
  107. //TODO
  108. argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames,
  109. getUserDeclaredConstructor(candidate), autowiring);
  110. }
  111. catch (UnsatisfiedDependencyException ex) {
  112. if (this.beanFactory.logger.isTraceEnabled()) {
  113. this.beanFactory.logger.trace(
  114. "Ignoring constructor [" + candidate + "] of bean '" + beanName + "': " + ex);
  115. }
  116. // Swallow and try next constructor.
  117. if (causes == null) {
  118. causes = new LinkedList<>();
  119. }
  120. causes.add(ex);
  121. continue;
  122. }
  123. }
  124. else {
  125. // Explicit arguments given -> arguments length must match exactly.
  126. if (paramTypes.length != explicitArgs.length) {
  127. continue;
  128. }
  129. argsHolder = new ArgumentsHolder(explicitArgs);
  130. }
  131. //计算差异值 -1024
  132. int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
  133. argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
  134. // Choose this constructor if it represents the closest match.
  135. if (typeDiffWeight < minTypeDiffWeight) {
  136. constructorToUse = candidate;
  137. argsHolderToUse = argsHolder;
  138. argsToUse = argsHolder.arguments;
  139. minTypeDiffWeight = typeDiffWeight;
  140. ambiguousConstructors = null;
  141. }
  142. //模糊不清楚的 两个构造方法算法一样 会随机选择一个
  143. else if (constructorToUse != null && typeDiffWeight == minTypeDiffWeight) {
  144. if (ambiguousConstructors == null) {
  145. ambiguousConstructors = new LinkedHashSet<>();
  146. ambiguousConstructors.add(constructorToUse);
  147. }
  148. //模糊不清楚的
  149. ambiguousConstructors.add(candidate);
  150. }
  151. }
  152. //如果没有找到处理异常
  153. if (constructorToUse == null) {
  154. if (causes != null) {
  155. UnsatisfiedDependencyException ex = causes.removeLast();
  156. for (Exception cause : causes) {
  157. this.beanFactory.onSuppressedException(cause);
  158. }
  159. throw ex;
  160. }
  161. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  162. "Could not resolve matching constructor " +
  163. "(hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)");
  164. }
  165. //mbd.isLenientConstructorResolution() 宽松模式
  166. else if (ambiguousConstructors != null && !mbd.isLenientConstructorResolution()) {
  167. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  168. "Ambiguous constructor matches found in bean '" + beanName + "' " +
  169. "(hint: specify index/type/name arguments for simple parameters to avoid type ambiguities): " +
  170. ambiguousConstructors);
  171. }
  172. if (explicitArgs == null) {
  173. //todo
  174. argsHolderToUse.storeCache(mbd, constructorToUse);
  175. }
  176. }
  177. try {
  178. final InstantiationStrategy strategy = beanFactory.getInstantiationStrategy();
  179. Object beanInstance;
  180. if (System.getSecurityManager() != null) {
  181. final Constructor<?> ctorToUse = constructorToUse;
  182. final Object[] argumentsToUse = argsToUse;
  183. beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
  184. strategy.instantiate(mbd, beanName, beanFactory, ctorToUse, argumentsToUse),
  185. beanFactory.getAccessControlContext());
  186. }
  187. else {
  188. beanInstance = strategy.instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse);
  189. }
  190. bw.setBeanInstance(beanInstance);
  191. return bw;
  192. }
  193. catch (Throwable ex) {
  194. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  195. "Bean instantiation via constructor failed", ex);
  196. }
  197. }

五、处理合并BeanDefinition与解决循环依赖后置处理器

实例化后会第三和第四调用后置处理器

5.1、第三调用后置处理器MergedBeanDefinitionPostProcessor

这里主要解决 处理合并BeanDefinition的问题

入口:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)

接口:这个后置处理器 需要实现 MergedBeanDefinitionPostProcessor 接口中的postProcessMergedBeanDefinition方法

1、合并相关介绍:

为什么会提前合并 下面代码

通过类型找到名字---返回一个BeanFactoryPostProcessor的集合--完成了合并

不能用原始的BeanDefinition 去比较 必须合并

代码流程 ---AbstractApplicationContext.invokeBeanFactoryPostProcessors(beanFactory);-->>PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());-->DefaultListableBeanFactory.getBeanNamesForType(@Nullable Class<?> type) -->RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

  1. /通过类型找到名字---返回一个BeanFactoryPostProcessor的集合--完成了合并
  2. //返回一个BeanDefinition 后置工厂的名字的集合--通过名字实例化BeanFactoryPostProcessor
  3. String[] postProcessorNames =
  4. beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
  5. for (String ppName : postProcessorNames) {
  6. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  7. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
  8. processedBeans.add(ppName);
  9. }
  10. }

但是在实例化bean的时候会重新在去 合并bd 会把缓存中的合并后的BeanDefinition删除在重新合并

AbstractAutowireCapableBeanFactory applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);调用后置处理的源码

  1. protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
  2. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  3. if (bp instanceof MergedBeanDefinitionPostProcessor) {
  4. MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
  5. bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
  6. }
  7. }
  8. }

1.1 、实现类:AutowiredAnnotationBeanPostProcessor

  • findAutowiredMetadata----找出所有需要完成注入的“点”-----@Autowired @Value注解方法或者属性---为什么不需要构造方法
  • ​​​​checkConfigMembers----injectedElements 做了一个复制
  1. @Override
  2. public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
  3. //
  4. InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
  5. metadata.checkConfigMembers(beanDefinition);
  6. }

1.2、实现类:CommonAnnotationBeanPostProcessor

  • 调用父类的方法,查找所有的生命周期回调方法---初始化和销毁
  • findResourceMetadata----找出所有需要完成注入的“点”-----@Resource注解
  • checkConfigMembers----injectedElements 做了一个复制
  1. @Override
  2. public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
  3. super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
  4. InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
  5. metadata.checkConfigMembers(beanDefinition);
  6. }

两者使用的bean的后置处理器不一样的。

5.2、第四次调用后置处理器 解决循环依赖提前暴露一个工厂

这个工厂是一个lambda表达式,在出现循环依赖的时候执行

重点 解决循环依赖 提前暴露的是一个工厂 而不是一个对象;

地址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference(beanName, mbd, bean)

  1. //向容器中缓存单例模式的Bean对象,以防循环引用
  2. //TODO 判断是否允许循环依赖
  3. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
  4. isSingletonCurrentlyInCreation(beanName));
  5. if (earlySingletonExposure) {
  6. if (logger.isDebugEnabled()) {
  7. logger.debug("Eagerly caching bean '" + beanName +
  8. "' to allow for resolving potential circular references");
  9. }
  10. //这里是一个匿名内部类,为了防止循环引用,尽早持有对象的引用
  11. //TODO 第四调用后置处理器
  12. // 重点 解决循环依赖 提前暴露的是一个工厂 而不是一个对象
  13. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  14. }

接口: SmartInstantiationAwareBeanPostProcessor# getEarlyBeanReference

  1. protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
  2. Object exposedObject = bean;
  3. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  4. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  5. if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
  6. SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
  7. exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
  8. }
  9. }
  10. }
  11. return exposedObject;
  12. }

实现类:AbstractAutoProxyCreator #getEarlyBeanReference

下面是添加到二级缓存中

  1. @Override
  2. public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
  3. Object cacheKey = getCacheKey(bean.getClass(), beanName);
  4. if (!this.earlyProxyReferences.contains(cacheKey)) {
  5. this.earlyProxyReferences.add(cacheKey);
  6. }
  7. return wrapIfNecessary(bean, beanName, cacheKey);
  8. }

六、spring bean实例化后置阶段

这个阶段主要判断当前实例化的bean是否需要属性注入

6.1、第五次调用后置处理器 :属性是否注入InstantiationAwareBeanPostProcessor

路径:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean(beanName, mbd, instanceWrapper)

  1. //todo 第五次---属性是否注入InstantiationAwareBeanPostProcessor
  2. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  3. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  4. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  5. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  6. if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
  7. continueWithPropertyPopulation = false;
  8. break;
  9. }
  10. }
  11. }
  12. }

接口:InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)

所有spring内置的实现类都为true

6.2、测试实例 

我们当创建use bean的时候放回 false。这样这个bean就不会填充任何属性了。

  1. /**
  2. * Bean 实例化生命周期示例
  3. *
  4. * @Author: dukun0210
  5. * @Date: 2021/2/17 19:23
  6. */
  7. public class BeanInstantiationDemo {
  8. public static void main(String[] args) {
  9. DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
  10. // 方法一:添加 BeanPostProcessor 实现 MyInstantiationAwareBeanPostProcessor
  11. beanFactory.addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessorDome());
  12. XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
  13. String location = "META-INF/dependency-lookup-context.xml";
  14. Resource resource = new ClassPathResource(location);
  15. // 指定字符编码 UTF-8
  16. EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
  17. beanDefinitionReader.loadBeanDefinitions(encodedResource);
  18. // 通过 Bean Id 和类型进行依赖查找
  19. User user = beanFactory.getBean("user", User.class);
  20. System.out.println(user);
  21. User superUser = beanFactory.getBean("superUser", User.class);
  22. System.out.println(superUser);
  23. }
  24. /**
  25. * 实现 后置处理器
  26. */
  27. static class MyInstantiationAwareBeanPostProcessorDome implements InstantiationAwareBeanPostProcessor {
  28. @Override
  29. public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  30. if(ObjectUtils.nullSafeEquals("superUser",beanName) && SuperUser.class.equals(beanClass)){
  31. //把配置完成的 superUser bean覆盖
  32. return new SuperUser();
  33. }
  34. return null;//这里表示什么都不变化
  35. }
  36. @Override
  37. public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
  38. if(ObjectUtils.nullSafeEquals("superUser",beanName) && SuperUser.class.equals(beanClass)){
  39. //如果是 user 对象不允许属性的赋值
  40. return false;
  41. }
  42. return true;//这里表示什么都不变化
  43. }
  44. }
  45. }

总结:

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/66353
推荐阅读
相关标签
  

闽ICP备14008679号