Spring BeanFactory

BeanFactory 概述

  • org.springframework.beans.factory.BeanFactory

类图

beanFactory

方法列表

  • 贴出部分代码. 仅表示方法作用
  1. public interface BeanFactory {
  2. // 从容器中根据beanname获取
  3. Object getBean(String name) throws BeansException;
  4. // 延迟加载对象
  5. <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
  6. // 是否存在beanName
  7. boolean containsBean(String name);
  8. // 这个 beanName 是否是单例的. 映射成 bean
  9. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  10. // 是否多例.
  11. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  12. // 类型是否匹配
  13. boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
  14. // 获取bean的类型
  15. Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  16. // 获取别名
  17. String[] getAliases(String name);
  18. }

解析

用例

bean 的实例化有如下几种方法

  1. 静态方法
  2. 工厂方法创建
  3. FactoryBean 接口创建

代码部分

  1. public class UserBean {
  2. private String name;
  3. private Integer age;
  4. public static UserBean createInstance() {
  5. UserBean userBean = new UserBean();
  6. userBean.setAge(18);
  7. userBean.setName("zhangsan");
  8. return userBean;
  9. }
  10. // get set 忽略
  11. }
  1. public interface UserBeanFactory {
  2. UserBean factory();
  3. }
  4. public class UserBeanFactoryImpl implements
  5. UserBeanFactory {
  6. @Override
  7. public UserBean factory() {
  8. return UserBean.createInstance();
  9. }
  10. }
  1. public class UserFactoryBean implements FactoryBean<UserBean> {
  2. @Override
  3. public boolean isSingleton() {
  4. return true;
  5. }
  6. @Override
  7. public UserBean getObject() throws Exception {
  8. return UserBean.createInstance();
  9. }
  10. @Override
  11. public Class<?> getObjectType() {
  12. return UserBean.class;
  13. }
  14. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 静态方法-->
  6. <bean id="static-method-user"
  7. class="org.source.hot.spring.overview.ioc.bean.init.UserBean"
  8. factory-method="createInstance"/>
  9. <!-- 工厂方法创建-->
  10. <bean id="factory-use" class="org.source.hot.spring.overview.ioc.bean.init.UserBean"
  11. factory-bean="userFactory" factory-method="factory"></bean>
  12. <!--user 工厂bean-->
  13. <bean id="userFactory"
  14. class="org.source.hot.spring.overview.ioc.bean.init.UserBeanFactoryImpl"/>
  15. <!--factory bean-->
  16. <bean id="factory-bean-user"
  17. class="org.source.hot.spring.overview.ioc.bean.init.UserFactoryBean"/>
  18. </beans>
  1. public class SpringBeanInstantiation {
  2. public static void main(String[] args) {
  3. BeanFactory context = new ClassPathXmlApplicationContext(
  4. "META-INF/beans/spring-bean-instantiation.xml");
  5. UserBean staticMethodBean = context.getBean("static-method-user", UserBean.class);
  6. UserBean factoryUser = context.getBean("factory-use", UserBean.class);
  7. UserBean factoryBean = context.getBean("factory-bean-user", UserBean.class);
  8. System.out.println();
  9. }
  10. }

分析

  • 对下面代码进行分析
  1. UserBean staticMethodBean = context.getBean("static-method-user", UserBean.class);
  • org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.String, java.lang.Class<T>)
  1. @Override
  2. public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
  3. // 判断 beanFactory 是否存活
  4. assertBeanFactoryActive();
  5. // 1. 获取 beanFactory
  6. // 2. 根据 beanName + class 获取 Bean
  7. return getBeanFactory().getBean(name, requiredType);
  8. }
  • 从方法参数
    • name: beanName
    • requiredType: 唯一的类型. 对象类型

assertBeanFactoryActive

  • beanFactory 是否存活判断
  1. protected void assertBeanFactoryActive() {
  2. // 是否存活
  3. if (!this.active.get()) {
  4. // 是否关闭
  5. if (this.closed.get()) {
  6. throw new IllegalStateException(getDisplayName() + " has been closed already");
  7. }
  8. else {
  9. throw new IllegalStateException(getDisplayName() + " has not been refreshed yet");
  10. }
  11. }
  12. }

getBeanFactory

  • 获取 beanFactory

    • 获取方法是一个抽象方法

      1. public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
      • 子类实现

        org.springframework.context.support.AbstractRefreshableApplicationContext#getBeanFactory

        1. @Override
        2. public final ConfigurableListableBeanFactory getBeanFactory() {
        3. synchronized (this.beanFactoryMonitor) {
        4. if (this.beanFactory == null) {
        5. throw new IllegalStateException("BeanFactory not initialized or already closed - " +
        6. "call 'refresh' before accessing beans via the ApplicationContext");
        7. }
        8. return this.beanFactory;
        9. }
        10. }
        • org.springframework.context.support.GenericApplicationContext#getBeanFactory
        1. @Override
        2. public final ConfigurableListableBeanFactory getBeanFactory() {
        3. return this.beanFactory;
        4. }
  • 获取到的对象是org.springframework.beans.factory.support.DefaultListableBeanFactory

image-20200902102912716

  • 整体类图

image-20200902103154580

doGetBean

  • org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

    获取 bean 的核心

transformedBeanName

  1. protected String transformedBeanName(String name) {
  2. // 转换 beanName .
  3. // 1. 通过·BeanFactoryUtils.transformedBeanName· 求beanName
  4. // 2. 如果是有别名的(方法参数是别名) . 会从别名列表中获取对应的 beanName
  5. return canonicalName(BeanFactoryUtils.transformedBeanName(name));
  6. }
  1. public static String transformedBeanName(String name) {
  2. Assert.notNull(name, "'name' must not be null");
  3. // 名字不是 & 开头直接返回
  4. if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
  5. return name;
  6. }
  7. // 截取字符串 在返回
  8. return transformedBeanNameCache.computeIfAbsent(name, beanName -> {
  9. do {
  10. beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
  11. }
  12. while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
  13. return beanName;
  14. });
  15. }
  1. public String canonicalName(String name) {
  2. String canonicalName = name;
  3. // Handle aliasing...
  4. String resolvedName;
  5. do {
  6. // 别名的获取
  7. resolvedName = this.aliasMap.get(canonicalName);
  8. if (resolvedName != null) {
  9. canonicalName = resolvedName;
  10. }
  11. }
  12. while (resolvedName != null);
  13. return canonicalName;
  14. }

别名对象

  1. private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
  1. <bean id="factory-bean-user"
  2. class="org.source.hot.spring.overview.ioc.bean.init.UserFactoryBean"/>
  3. <alias name="factory-bean-user" alias="userFactoryBean"/>

aliasMap 和 别名标签的对应关系

image-20200902105454958

alias 标签的 alias 值作为别名的 key , alias 标签的 name 值作为 value

getSingleton

  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)
  1. @Override
  2. @Nullable
  3. public Object getSingleton(String beanName) {
  4. return getSingleton(beanName, true);
  5. }
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
  1. @Nullable
  2. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  3. // 尝试从单例缓存中获取
  4. Object singletonObject = this.singletonObjects.get(beanName);
  5. // 单例对象是否null
  6. // 这个 beanName 是否正在创建
  7. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  8. // 锁
  9. synchronized (this.singletonObjects) {
  10. // 从延迟加载的map中获取
  11. singletonObject = this.earlySingletonObjects.get(beanName);
  12. // 对象是否空 , 是否允许提前应用
  13. if (singletonObject == null && allowEarlyReference) {
  14. // 从对象工厂map中获取对象工厂
  15. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  16. if (singletonFactory != null) {
  17. // 对象获取后设置
  18. singletonObject = singletonFactory.getObject();
  19. this.earlySingletonObjects.put(beanName, singletonObject);
  20. this.singletonFactories.remove(beanName);
  21. }
  22. }
  23. }
  24. }
  25. return singletonObject;
  26. }
  • 相关属性值
  1. /**
  2. * Cache of singleton objects: bean name to bean instance.
  3. *
  4. * 单例对象容器, key: beanName , value: bean实例
  5. * */
  6. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
  7. /**
  8. * Cache of singleton factories: bean name to ObjectFactory.
  9. * key: beanName
  10. * value: 对象工厂
  11. * */
  12. private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
  13. /**
  14. * Names of beans that are currently in creation.
  15. *
  16. * 当前正在实例化的beanName
  17. *
  18. * */
  19. private final Set<String> singletonsCurrentlyInCreation =
  20. Collections.newSetFromMap(new ConcurrentHashMap<>(16));

getObjectForBeanInstance

  • org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance
  1. protected Object getObjectForBeanInstance(
  2. Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
  3. // Don't let calling code try to dereference the factory if the bean isn't a factory.
  4. // 判断 beanName 是不是 bean 工厂
  5. if (BeanFactoryUtils.isFactoryDereference(name)) {
  6. // 类型判断
  7. if (beanInstance instanceof NullBean) {
  8. return beanInstance;
  9. }
  10. if (!(beanInstance instanceof FactoryBean)) {
  11. throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
  12. }
  13. if (mbd != null) {
  14. mbd.isFactoryBean = true;
  15. }
  16. // 返回实例
  17. return beanInstance;
  18. }
  19. // Now we have the bean instance, which may be a normal bean or a FactoryBean.
  20. // If it's a FactoryBean, we use it to create a bean instance, unless the
  21. // caller actually wants a reference to the factory.
  22. // 判断是否是 factoryBean
  23. if (!(beanInstance instanceof FactoryBean)) {
  24. return beanInstance;
  25. }
  26. Object object = null;
  27. if (mbd != null) {
  28. mbd.isFactoryBean = true;
  29. }
  30. else {
  31. // 缓存中获取
  32. object = getCachedObjectForFactoryBean(beanName);
  33. }
  34. if (object == null) {
  35. // Return bean instance from factory.
  36. // 如果还是 null 从 factory bean 中创建
  37. FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
  38. // Caches object obtained from FactoryBean if it is a singleton.
  39. if (mbd == null && containsBeanDefinition(beanName)) {
  40. mbd = getMergedLocalBeanDefinition(beanName);
  41. }
  42. boolean synthetic = (mbd != null && mbd.isSynthetic());
  43. // 从 FactoryBean 中获取bean实例
  44. object = getObjectFromFactoryBean(factory, beanName, !synthetic);
  45. }
  46. return object;
  47. }

getObjectFromFactoryBean

  • org.springframework.beans.factory.support.FactoryBeanRegistrySupport#getObjectFromFactoryBean

  • 从 FactoryBean 中获取对象

  1. protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
  2. // 是否单例 是否已经包含
  3. if (factory.isSingleton() && containsSingleton(beanName)) {
  4. synchronized (getSingletonMutex()) {
  5. // 从工厂bean的缓存中获取
  6. Object object = this.factoryBeanObjectCache.get(beanName);
  7. if (object == null) {
  8. // 从 factoryBean 接口中获取
  9. object = doGetObjectFromFactoryBean(factory, beanName);
  10. // Only post-process and store if not put there already during getObject() call above
  11. // (e.g. because of circular reference processing triggered by custom getBean calls)
  12. // 从缓存map中获取
  13. Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
  14. if (alreadyThere != null) {
  15. // 如果缓存中获取有值
  16. // object 覆盖
  17. object = alreadyThere;
  18. }
  19. else {
  20. if (shouldPostProcess) {
  21. if (isSingletonCurrentlyInCreation(beanName)) {
  22. // Temporarily return non-post-processed object, not storing it yet..
  23. return object;
  24. }
  25. // 单例创建前的验证
  26. beforeSingletonCreation(beanName);
  27. try {
  28. // 从 FactoryBean 接口创建的 后置处理
  29. object = postProcessObjectFromFactoryBean(object, beanName);
  30. }
  31. catch (Throwable ex) {
  32. throw new BeanCreationException(beanName,
  33. "Post-processing of FactoryBean's singleton object failed", ex);
  34. }
  35. finally {
  36. // 单例bean创建之后
  37. afterSingletonCreation(beanName);
  38. }
  39. }
  40. // 是否包含bean name
  41. if (containsSingleton(beanName)) {
  42. // 插入缓存
  43. // 后续使用的时候可以直接获取
  44. this.factoryBeanObjectCache.put(beanName, object);
  45. }
  46. }
  47. }
  48. return object;
  49. }
  50. }
  51. else {
  52. Object object = doGetObjectFromFactoryBean(factory, beanName);
  53. if (shouldPostProcess) {
  54. try {
  55. object = postProcessObjectFromFactoryBean(object, beanName);
  56. }
  57. catch (Throwable ex) {
  58. throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
  59. }
  60. }
  61. return object;
  62. }
  63. }

beforeSingletonCreation

  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#beforeSingletonCreation

  • 单例创建前的验证

  1. protected void beforeSingletonCreation(String beanName) {
  2. // 排除的单例beanName 是否包含当前beanName
  3. // 添加当前正在初始化的beanName 是否正确
  4. if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
  5. throw new BeanCurrentlyInCreationException(beanName);
  6. }
  7. }

postProcessObjectFromFactoryBean

  • 两种实现

    • org.springframework.beans.factory.support.FactoryBeanRegistrySupport#postProcessObjectFromFactoryBean

      1. protected Object postProcessObjectFromFactoryBean(Object object, String beanName) throws BeansException {
      2. return object;
      3. }

      直接返回 object

    • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean 调用 BeanPostProcessor

      ```java

      1. @Override
      2. protected Object postProcessObjectFromFactoryBean(Object object, String beanName) {
      3. return applyBeanPostProcessorsAfterInitialization(object, beanName);
      4. }
  1. @Override
  2. public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
  3. throws BeansException {
  4. Object result = existingBean;
  5. for (BeanPostProcessor processor : getBeanPostProcessors()) {
  6. Object current = processor.postProcessAfterInitialization(result, beanName);
  7. if (current == null) {
  8. return result;
  9. }
  10. result = current;
  11. }
  12. return result;
  13. }
  14. ```
  • 两个方法军返回 Bean 对象 . 一种是直接返回 。 另一种是执行接口 BeanPostProcessor 接口返回

afterSingletonCreation

  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#afterSingletonCreation
  1. protected void afterSingletonCreation(String beanName) {
  2. // 排除的单例beanName 是否包含当前beanName
  3. // 移除当前正在初始化的beanName 是否正确
  4. if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
  5. throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
  6. }
  7. }
  • 代码现在进入的很深了,回到 doGetBean
  • org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
  1. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
  2. @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  3. // 转换beanName
  4. final String beanName = transformedBeanName(name);
  5. Object bean;
  6. // Eagerly check singleton cache for manually registered singletons.
  7. // 获取单例对象
  8. Object sharedInstance = getSingleton(beanName);
  9. // 单例对象是否存在 参数是否为空
  10. if (sharedInstance != null && args == null) {
  11. if (logger.isTraceEnabled()) {
  12. if (isSingletonCurrentlyInCreation(beanName)) {
  13. logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
  14. "' that is not fully initialized yet - a consequence of a circular reference");
  15. }
  16. else {
  17. logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
  18. }
  19. }
  20. // 实例化bean
  21. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  22. }
  23. // 省略后续内容
  24. }
  • 目前未知doGetBean的第一个if分支已经分析完毕. 接下来看下面的代码

  • 下面这段代码就简单说一下就跳过了。

    • 从 容器中获取,最后还是回到 doGetBean 方法中. 来进行 bean 创建 这里不进行展开。
  1. else {
  2. // Fail if we're already creating this bean instance:
  3. // We're assumably within a circular reference.
  4. // 循环依赖的问题
  5. if (isPrototypeCurrentlyInCreation(beanName)) {
  6. throw new BeanCurrentlyInCreationException(beanName);
  7. }
  8. // Check if bean definition exists in this factory.
  9. BeanFactory parentBeanFactory = getParentBeanFactory();
  10. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  11. // Not found -> check parent.
  12. String nameToLookup = originalBeanName(name);
  13. if (parentBeanFactory instanceof AbstractBeanFactory) {
  14. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  15. nameToLookup, requiredType, args, typeCheckOnly);
  16. }
  17. else if (args != null) {
  18. // Delegation to parent with explicit args.
  19. return (T) parentBeanFactory.getBean(nameToLookup, args);
  20. }
  21. else if (requiredType != null) {
  22. // No args -> delegate to standard getBean method.
  23. return parentBeanFactory.getBean(nameToLookup, requiredType);
  24. }
  25. else {
  26. return (T) parentBeanFactory.getBean(nameToLookup);
  27. }
  28. }

markBeanAsCreated

  • org.springframework.beans.factory.support.AbstractBeanFactory#markBeanAsCreated

  • 方法作用将 bean 标记为已创建

  1. protected void markBeanAsCreated(String beanName) {
  2. // 已创建的beanName 是否包含当前beanName
  3. if (!this.alreadyCreated.contains(beanName)) {
  4. synchronized (this.mergedBeanDefinitions) {
  5. if (!this.alreadyCreated.contains(beanName)) {
  6. // Let the bean definition get re-merged now that we're actually creating
  7. // the bean... just in case some of its metadata changed in the meantime.
  8. // 将属性stale设置true
  9. clearMergedBeanDefinition(beanName);
  10. // 放入已创建集合中
  11. this.alreadyCreated.add(beanName);
  12. }
  13. }
  14. }
  15. }
  1. protected void clearMergedBeanDefinition(String beanName) {
  2. RootBeanDefinition bd = this.mergedBeanDefinitions.get(beanName);
  3. if (bd != null) {
  4. bd.stale = true;
  5. }
  6. }
  • stale 的解释

    1. /**
    2. * Determines if the definition needs to be re-merged.
    3. * 是否需要重新合并定义
    4. * */
    5. volatile boolean stale;
  • 属性值 已创建的 beanName

    1. private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));

getMergedLocalBeanDefinition

  • org.springframework.beans.factory.support.AbstractBeanFactory#getMergedLocalBeanDefinition

  • 这个方法获取一个RootBeanDefinition对象 , 这个对象也是 bean 的一种定义。

  • 从目前的几个方法名称来看,暂且认为这是一个合并了多个 BeanDefinition的对象吧

rootBeanDefinition

  1. protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
  2. // Quick check on the concurrent map first, with minimal locking.
  3. // 缓存中获取
  4. RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
  5. if (mbd != null && !mbd.stale) {
  6. return mbd;
  7. }
  8. // 合并的 bean 定义
  9. return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
  10. }
  11. protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd)
  12. throws BeanDefinitionStoreException {
  13. return getMergedBeanDefinition(beanName, bd, null);
  14. }

getBeanDefinition

  • 获取 beanDefinition
  • org.springframework.beans.factory.support.DefaultListableBeanFactory#getBeanDefinition
  1. @Override
  2. public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
  3. BeanDefinition bd = this.beanDefinitionMap.get(beanName);
  4. if (bd == null) {
  5. if (logger.isTraceEnabled()) {
  6. logger.trace("No bean named '" + beanName + "' found in " + this);
  7. }
  8. throw new NoSuchBeanDefinitionException(beanName);
  9. }
  10. return bd;
  11. }
  • 从 beanDefinition map 中获取

  • 相关属性

    1. /**
    2. * Map of bean definition objects, keyed by bean name.
    3. *
    4. * key: beanName
    5. * value: BeanDefinition
    6. *
    7. * */
    8. private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

getMergedBeanDefinition

  • 获取RootBeanDefinition

  • org.springframework.beans.factory.support.AbstractBeanFactory#getMergedBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.config.BeanDefinition)

  • 第一部分代码

    • map 中获取 RootBeanDefinition
    • 是否存在父名称
    • 类型是否是 RootBeanDefinition
      • 是: 拷贝
      • 否: 将 BeanDefinition 转换成 RootBeanDefinition
  1. protected RootBeanDefinition getMergedBeanDefinition(
  2. String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
  3. throws BeanDefinitionStoreException {
  4. synchronized (this.mergedBeanDefinitions) {
  5. RootBeanDefinition mbd = null;
  6. RootBeanDefinition previous = null;
  7. // Check with full lock now in order to enforce the same merged instance.
  8. if (containingBd == null) {
  9. // 从缓存中获取
  10. mbd = this.mergedBeanDefinitions.get(beanName);
  11. }
  12. if (mbd == null || mbd.stale) {
  13. previous = mbd;
  14. // 是否存在父名称
  15. if (bd.getParentName() == null) {
  16. // Use copy of given root bean definition.
  17. // 类型是否等于RootBeanDefinition
  18. if (bd instanceof RootBeanDefinition) {
  19. // 做一次对象拷贝
  20. mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
  21. }
  22. else {
  23. // 将 beanDefinition 创建成 RootBeanDefinition
  24. mbd = new RootBeanDefinition(bd);
  25. }
  26. }
  27. // 省略其他
  28. }
  • 相关属性

    1. /**
    2. * Map from bean name to merged RootBeanDefinition.
    3. * key: beanName
    4. * value: RootBeanDefinition
    5. * */
    6. private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);
  • 克隆 方法

    1. /**
    2. * 克隆 BeanDefinition
    3. * @return
    4. */
    5. @Override
    6. public RootBeanDefinition cloneBeanDefinition() {
    7. return new RootBeanDefinition(this);
    8. }
  • 第二部分代码

  1. {
  2. // Child bean definition: needs to be merged with parent.
  3. // 父BeanDefinition
  4. BeanDefinition pbd;
  5. try {
  6. // 父类beanName
  7. String parentBeanName = transformedBeanName(bd.getParentName());
  8. // 当前beanName是否等于父的beanName
  9. if (!beanName.equals(parentBeanName)) {
  10. // 存在父 beanName
  11. // 父 beanDefinition
  12. // 递归调用
  13. pbd = getMergedBeanDefinition(parentBeanName);
  14. }
  15. else {
  16. // 获取父 beanFactory
  17. BeanFactory parent = getParentBeanFactory();
  18. // beanFactory 类型判断
  19. if (parent instanceof ConfigurableBeanFactory) {
  20. // ConfigurableBeanFactory 的获取方式
  21. pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);
  22. }
  23. else {
  24. throw new NoSuchBeanDefinitionException(parentBeanName,
  25. "Parent name '" + parentBeanName + "' is equal to bean name '" + beanName +
  26. "': cannot be resolved without an AbstractBeanFactory parent");
  27. }
  28. }
  29. }
  30. catch (NoSuchBeanDefinitionException ex) {
  31. throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
  32. "Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);
  33. }
  34. // Deep copy with overridden values.
  35. // 将 父 BeanDefinition 对象拷贝
  36. mbd = new RootBeanDefinition(pbd);
  37. // 覆盖 beanDefinition
  38. mbd.overrideFrom(bd);
  39. }

overrideFrom

  • 覆盖方法

  • org.springframework.beans.factory.support.AbstractBeanDefinition#overrideFrom

  • 最后一段

  1. // Set default singleton scope, if not configured before.
  2. // 作用域设置
  3. if (!StringUtils.hasLength(mbd.getScope())) {
  4. // 没有设置作用域直接给单例类型
  5. mbd.setScope(SCOPE_SINGLETON);
  6. }
  7. // A bean contained in a non-singleton bean cannot be a singleton itself.
  8. // Let's correct this on the fly here, since this might be the result of
  9. // parent-child merging for the outer bean, in which case the original inner bean
  10. // definition will not have inherited the merged outer bean's singleton status.
  11. // 修正 作用域
  12. if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
  13. mbd.setScope(containingBd.getScope());
  14. }
  15. // Cache the merged bean definition for the time being
  16. // (it might still get re-merged later on in order to pick up metadata changes)
  17. if (containingBd == null && isCacheBeanMetadata()) {
  18. // 放入缓存
  19. this.mergedBeanDefinitions.put(beanName, mbd);
  20. }
  21. }
  22. if (previous != null) {
  23. copyRelevantMergedBeanDefinitionCaches(previous, mbd);
  24. }
  25. return mbd;

checkMergedBeanDefinition

  • org.springframework.beans.factory.support.AbstractBeanFactory#checkMergedBeanDefinition

    1. protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, @Nullable Object[] args)
    2. throws BeanDefinitionStoreException {
    3. if (mbd.isAbstract()) {
    4. throw new BeanIsAbstractException(beanName);
    5. }
    6. }
    • 判断是否 abstract 标记的情况
  • 继续回到 doGetBean 方法

  1. // 需要依赖的bean
  2. String[] dependsOn = mbd.getDependsOn();
  3. if (dependsOn != null) {
  4. for (String dep : dependsOn) {
  5. if (isDependent(beanName, dep)) {
  6. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  7. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  8. }
  9. // 注册依赖bean
  10. registerDependentBean(dep, beanName);
  11. try {
  12. getBean(dep);
  13. }
  14. catch (NoSuchBeanDefinitionException ex) {
  15. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  16. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
  17. }
  18. }
  19. }

isDependent

  • 是否存在依赖关系

  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#isDependent(java.lang.String, java.lang.String, java.util.Set<java.lang.String>)

  1. private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) {
  2. if (alreadySeen != null && alreadySeen.contains(beanName)) {
  3. return false;
  4. }
  5. // 别名
  6. String canonicalName = canonicalName(beanName);
  7. // 依赖列表中获取
  8. Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
  9. if (dependentBeans == null) {
  10. return false;
  11. }
  12. if (dependentBeans.contains(dependentBeanName)) {
  13. return true;
  14. }
  15. for (String transitiveDependency : dependentBeans) {
  16. if (alreadySeen == null) {
  17. alreadySeen = new HashSet<>();
  18. }
  19. alreadySeen.add(beanName);
  20. if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
  21. return true;
  22. }
  23. }
  24. return false;
  25. }
  • 相关属性

    1. /**
    2. * Map between dependent bean names: bean name to Set of dependent bean names.
    3. *
    4. * key: bean
    5. * value: 依赖列表
    6. * */
    7. private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
  • 一个用例

  1. <bean class="org.source.hot.spring.overview.ioc.bean.init.SystemUserBean" >
  2. <property name="userBean" ref="factory-use"/>
  3. </bean>

image-20200903091759451

registerDependentBean

  • 注册依赖关系
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#registerDependentBean
    • 在前文调用 isDependent 方法的的时候我们找到了一个依赖映射dependentBeanMap ,在这个方法中会将依赖关系放入dependentBeanMap
  1. public void registerDependentBean(String beanName, String dependentBeanName) {
  2. // 别名
  3. String canonicalName = canonicalName(beanName);
  4. synchronized (this.dependentBeanMap) {
  5. // 向依赖关系中放入数据
  6. Set<String> dependentBeans =
  7. this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
  8. if (!dependentBeans.add(dependentBeanName)) {
  9. return;
  10. }
  11. }
  12. synchronized (this.dependenciesForBeanMap) {
  13. Set<String> dependenciesForBean =
  14. this.dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new LinkedHashSet<>(8));
  15. dependenciesForBean.add(canonicalName);
  16. }
  17. }
  • 再回到 doGetBean

  • 接下来就是实例化的过程了.

  1. if (mbd.isSingleton()) {
  2. sharedInstance = getSingleton(beanName, () -> {
  3. try {
  4. return createBean(beanName, mbd, args);
  5. }
  6. catch (BeansException ex) {
  7. // Explicitly remove instance from singleton cache: It might have been put there
  8. // eagerly by the creation process, to allow for circular reference resolution.
  9. // Also remove any beans that received a temporary reference to the bean.
  10. destroySingleton(beanName);
  11. throw ex;
  12. }
  13. });
  14. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  15. }

getSingleton

  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
  • 获取单例对象

    1. 从单例对象的 map 缓存中获取
    2. 从 ObjectFactory 中获取
  • 周边方法

    • beforeSingletonCreation

    • afterSingletonCreation

    • addSingleton
  1. public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
  2. Assert.notNull(beanName, "Bean name must not be null");
  3. synchronized (this.singletonObjects) {
  4. // 从单例对象缓存中获取
  5. Object singletonObject = this.singletonObjects.get(beanName);
  6. if (singletonObject == null) {
  7. if (this.singletonsCurrentlyInDestruction) {
  8. throw new BeanCreationNotAllowedException(beanName,
  9. "Singleton bean creation not allowed while singletons of this factory are in destruction " +
  10. "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
  11. }
  12. if (logger.isDebugEnabled()) {
  13. logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
  14. }
  15. // 单例创建前的验证
  16. beforeSingletonCreation(beanName);
  17. boolean newSingleton = false;
  18. boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
  19. if (recordSuppressedExceptions) {
  20. this.suppressedExceptions = new LinkedHashSet<>();
  21. }
  22. try {
  23. // 从 ObjectFactory 中获取
  24. singletonObject = singletonFactory.getObject();
  25. newSingleton = true;
  26. }
  27. catch (IllegalStateException ex) {
  28. // Has the singleton object implicitly appeared in the meantime ->
  29. // if yes, proceed with it since the exception indicates that state.
  30. singletonObject = this.singletonObjects.get(beanName);
  31. if (singletonObject == null) {
  32. throw ex;
  33. }
  34. }
  35. catch (BeanCreationException ex) {
  36. if (recordSuppressedExceptions) {
  37. for (Exception suppressedException : this.suppressedExceptions) {
  38. ex.addRelatedCause(suppressedException);
  39. }
  40. }
  41. throw ex;
  42. }
  43. finally {
  44. if (recordSuppressedExceptions) {
  45. this.suppressedExceptions = null;
  46. }
  47. // 创建单例对象后的验证
  48. afterSingletonCreation(beanName);
  49. }
  50. if (newSingleton) {
  51. // 添加到 单例容器中
  52. addSingleton(beanName, singletonObject);
  53. }
  54. }
  55. return singletonObject;
  56. }
  57. }
  • 回到 doGetBean 方法中

    1. if (mbd.isSingleton()) {
    2. // 判断是否是单例
    3. sharedInstance = getSingleton(beanName, () -> {
    4. try {
    5. return createBean(beanName, mbd, args);
    6. }
    7. catch (BeansException ex) {
    8. // Explicitly remove instance from singleton cache: It might have been put there
    9. // eagerly by the creation process, to allow for circular reference resolution.
    10. // Also remove any beans that received a temporary reference to the bean.
    11. destroySingleton(beanName);
    12. throw ex;
    13. }
    14. });
    15. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    16. }

    这里又要给 createBean方法, 从 getSingleton 的参数看可以知道 ,第二个匿名函数是ObjectFactory接口实现.

    1. @FunctionalInterface
    2. public interface ObjectFactory<T> {
    3. /**
    4. * Return an instance (possibly shared or independent)
    5. * of the object managed by this factory.
    6. * 获取对象
    7. * @return the resulting instance
    8. * @throws BeansException in case of creation errors
    9. */
    10. T getObject() throws BeansException;
    11. }
    • createBean 返回的就是单例 bean 对象的实例
createBean
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

  • 两个核心方法

  1. // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
  2. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  3. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
resolveBeforeInstantiation
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation

  • 方法概述:

    获取BeanPostProcessor接口的实现列表

    • applyBeanPostProcessorsBeforeInstantiation 前置方法执行
    • applyBeanPostProcessorsAfterInitialization后置方法执行
  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. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  7. Class<?> targetType = determineTargetType(beanName, mbd);
  8. if (targetType != null) {
  9. /**
  10. * 主要实现{@link org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(java.lang.Class, java.lang.String)}
  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. }
doCreateBean
  • 创建 bean
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
  1. // Instantiate the bean.
  2. BeanWrapper instanceWrapper = null;
  3. if (mbd.isSingleton()) {
  4. // beanFactory 移除当前创建的beanName
  5. instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  6. }
  7. // beanWrapper 是否存在
  8. if (instanceWrapper == null) {
  9. // 创建 bean 实例
  10. instanceWrapper = createBeanInstance(beanName, mbd, args);
  11. }
createBeanInstance
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
  • 创建 bean 实例
  1. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
  2. // Make sure bean class is actually resolved at this point.
  3. // 获取 bean class
  4. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  5. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  6. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  7. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName()
  8. );
  9. }
  10. // 返回一个用来创建bean实例的回调接口
  11. // Supplier get 直接获取bean对象
  12. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  13. if (instanceSupplier != null) {
  14. return obtainFromSupplier(instanceSupplier, beanName);
  15. }
  16. if (mbd.getFactoryMethodName() != null) {
  17. // 通过工厂方法创建
  18. return instantiateUsingFactoryMethod(beanName, mbd, args);
  19. }
  20. // Shortcut when re-creating the same bean...
  21. boolean resolved = false;
  22. boolean autowireNecessary = false;
  23. if (args == null) {
  24. synchronized (mbd.constructorArgumentLock) {
  25. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  26. resolved = true;
  27. autowireNecessary = mbd.constructorArgumentsResolved;
  28. }
  29. }
  30. }
  31. if (resolved) {
  32. if (autowireNecessary) {
  33. // 自动构造 bean
  34. return autowireConstructor(beanName, mbd, null, null);
  35. }
  36. else {
  37. // 实例化bean
  38. return instantiateBean(beanName, mbd);
  39. }
  40. }
  41. // Candidate constructors for autowiring?
  42. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  43. if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
  44. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  45. return autowireConstructor(beanName, mbd, ctors, args);
  46. }
  47. // Preferred constructors for default construction?
  48. ctors = mbd.getPreferredConstructors();
  49. if (ctors != null) {
  50. return autowireConstructor(beanName, mbd, ctors, null);
  51. }
  52. // No special handling: simply use no-arg constructor.
  53. return instantiateBean(beanName, mbd);
  54. }
resolveBeanClass
  • org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass
  • 获取 bean 的 class
  1. @Nullable
  2. protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)
  3. throws CannotLoadBeanClassException {
  4. try {
  5. // 是否包含 bean 类型
  6. if (mbd.hasBeanClass()) {
  7. // 直接返回
  8. return mbd.getBeanClass();
  9. }
  10. if (System.getSecurityManager() != null) {
  11. return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->
  12. doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
  13. }
  14. else {
  15. // 从 bean definition 中获取
  16. return doResolveBeanClass(mbd, typesToMatch);
  17. }
  18. }
  19. catch (PrivilegedActionException pae) {
  20. ClassNotFoundException ex = (ClassNotFoundException) pae.getException();
  21. throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
  22. }
  23. catch (ClassNotFoundException ex) {
  24. throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
  25. }
  26. catch (LinkageError err) {
  27. throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
  28. }
  29. }
doResolveBeanClass
  • org.springframework.beans.factory.support.AbstractBeanFactory#doResolveBeanClass

  • 第一段

    1. ClassLoader beanClassLoader = getBeanClassLoader();
    2. ClassLoader dynamicLoader = beanClassLoader;
    3. boolean freshResolve = false;
    4. // 判断 typesToMatch 是否为空
    5. if (!ObjectUtils.isEmpty(typesToMatch)) {
    6. // When just doing type checks (i.e. not creating an actual instance yet),
    7. // use the specified temporary class loader (e.g. in a weaving scenario).
    8. // 获取临时类加载器
    9. ClassLoader tempClassLoader = getTempClassLoader();
    10. if (tempClassLoader != null) {
    11. dynamicLoader = tempClassLoader;
    12. freshResolve = true;
    13. // 类型比较
    14. if (tempClassLoader instanceof DecoratingClassLoader) {
    15. DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader;
    16. for (Class<?> typeToMatch : typesToMatch) {
    17. // 添加排除的类
    18. dcl.excludeClass(typeToMatch.getName());
    19. }
    20. }
    21. }
    22. }
  • 第二段

    1. if (className != null) {
    2. // bean 属性值
    3. Object evaluated = evaluateBeanDefinitionString(className, mbd);
    4. if (!className.equals(evaluated)) {
    5. // A dynamically resolved expression, supported as of 4.2...
    6. if (evaluated instanceof Class) {
    7. return (Class<?>) evaluated;
    8. }
    9. else if (evaluated instanceof String) {
    10. className = (String) evaluated;
    11. freshResolve = true;
    12. }
    13. else {
    14. throw new IllegalStateException("Invalid class name expression result: " + evaluated);
    15. }
    16. }
evaluateBeanDefinitionString
  1. @Nullable
  2. protected Object evaluateBeanDefinitionString(@Nullable String value, @Nullable BeanDefinition beanDefinition) {
  3. // 占位符解析
  4. if (this.beanExpressionResolver == null) {
  5. return value;
  6. }
  7. Scope scope = null;
  8. if (beanDefinition != null) {
  9. // 获取 scope
  10. String scopeName = beanDefinition.getScope();
  11. if (scopeName != null) {
  12. // scope 转换成 接口值
  13. scope = getRegisteredScope(scopeName);
  14. }
  15. }
  16. // 返回对象
  17. return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
  18. }
evaluate
  • org.springframework.context.expression.StandardBeanExpressionResolver#evaluate
  1. @Override
  2. @Nullable
  3. public Object evaluate(@Nullable String value, BeanExpressionContext evalContext) throws BeansException {
  4. if (!StringUtils.hasLength(value)) {
  5. return value;
  6. }
  7. try {
  8. Expression expr = this.expressionCache.get(value);
  9. if (expr == null) {
  10. // el表达式解析
  11. expr = this.expressionParser.parseExpression(value, this.beanExpressionParserContext);
  12. // 解析结果放入缓存
  13. this.expressionCache.put(value, expr);
  14. }
  15. // spring 中默认的表达式上下文
  16. StandardEvaluationContext sec = this.evaluationCache.get(evalContext);
  17. if (sec == null) {
  18. // 设置属性
  19. sec = new StandardEvaluationContext(evalContext);
  20. sec.addPropertyAccessor(new BeanExpressionContextAccessor());
  21. sec.addPropertyAccessor(new BeanFactoryAccessor());
  22. sec.addPropertyAccessor(new MapAccessor());
  23. sec.addPropertyAccessor(new EnvironmentAccessor());
  24. sec.setBeanResolver(new BeanFactoryResolver(evalContext.getBeanFactory()));
  25. sec.setTypeLocator(new StandardTypeLocator(evalContext.getBeanFactory().getBeanClassLoader()));
  26. ConversionService conversionService = evalContext.getBeanFactory().getConversionService();
  27. if (conversionService != null) {
  28. sec.setTypeConverter(new StandardTypeConverter(conversionService));
  29. }
  30. customizeEvaluationContext(sec);
  31. this.evaluationCache.put(evalContext, sec);
  32. }
  33. // 把值获取
  34. return expr.getValue(sec);
  35. }
  36. catch (Throwable ex) {
  37. throw new BeanExpressionException("Expression parsing failed", ex);
  38. }
  39. }
  • 类图

Spring BeanFactory - 图7

BeanExpressionContext
  • 两个属性
  1. private final ConfigurableBeanFactory beanFactory;
  2. @Nullable
  3. private final Scope scope;
  • 几个方法
  1. public boolean containsObject(String key) {
  2. return (this.beanFactory.containsBean(key) ||
  3. (this.scope != null && this.scope.resolveContextualObject(key) != null));
  4. }
  5. @Nullable
  6. public Object getObject(String key) {
  7. if (this.beanFactory.containsBean(key)) {
  8. return this.beanFactory.getBean(key);
  9. }
  10. else if (this.scope != null) {
  11. return this.scope.resolveContextualObject(key);
  12. }
  13. else {
  14. return null;
  15. }
  16. }

beanName 是否存在

根据 beanName 获取 bean 实例

  • 回到解析方法
parseExpression
  1. @Override
  2. public Expression parseExpression(String expressionString, @Nullable ParserContext context) throws ParseException {
  3. if (context != null && context.isTemplate()) {
  4. // 是否使用 template 解析
  5. return parseTemplate(expressionString, context);
  6. }
  7. else {
  8. // 自定义的解析规则
  9. return doParseExpression(expressionString, context);
  10. }
  11. }
  • doParseExpression

    • spring 中的两种解析方式
      • org.springframework.expression.spel.standard.InternalSpelExpressionParser#doParseExpression
      • org.springframework.expression.spel.standard.SpelExpressionParser#doParseExpression
  • parseTemplate 方法

    • org.springframework.expression.common.TemplateAwareExpressionParser#parseTemplate
  1. private Expression parseTemplate(String expressionString, ParserContext context) throws ParseException {
  2. // 表达式为空
  3. if (expressionString.isEmpty()) {
  4. // 创建空的 LiteralExpression
  5. return new LiteralExpression("");
  6. }
  7. // 表达式解析成接口
  8. Expression[] expressions = parseExpressions(expressionString, context);
  9. if (expressions.length == 1) {
  10. return expressions[0];
  11. }
  12. else {
  13. // 返回字符串的表达式
  14. return new CompositeStringExpression(expressionString, expressions);
  15. }
  16. }

image-20200903111128603

  • parseExpressions

    • org.springframework.expression.common.TemplateAwareExpressionParser#parseExpressions
    • 说简单一些这个地方就是拿出表达式的值
  • 回到 evaluate 方法

  1. StandardEvaluationContext sec = this.evaluationCache.get(evalContext);
  2. if (sec == null) {
  3. // 设置属性
  4. sec = new StandardEvaluationContext(evalContext);
  5. sec.addPropertyAccessor(new BeanExpressionContextAccessor());
  6. sec.addPropertyAccessor(new BeanFactoryAccessor());
  7. sec.addPropertyAccessor(new MapAccessor());
  8. sec.addPropertyAccessor(new EnvironmentAccessor());
  9. sec.setBeanResolver(new BeanFactoryResolver(evalContext.getBeanFactory()));
  10. sec.setTypeLocator(new StandardTypeLocator(evalContext.getBeanFactory().getBeanClassLoader()));
  11. ConversionService conversionService = evalContext.getBeanFactory().getConversionService();
  12. if (conversionService != null) {
  13. sec.setTypeConverter(new StandardTypeConverter(conversionService));
  14. }
  15. customizeEvaluationContext(sec);
  16. this.evaluationCache.put(evalContext, sec);
  17. }
  18. // 把值获取
  19. return expr.getValue(sec);
  • 最后一句 getValue

    • org.springframework.expression.common.LiteralExpression#getValue(org.springframework.expression.EvaluationContext)

      刚才流程中我们可以看到 exprLiteralExpression

      1. @Override
      2. public String getValue(EvaluationContext context) {
      3. return this.literalValue;
      4. }

      直接返回字符串. 这个字符串就是刚才放进去的 el 表达式

往外跳 找到方法 doResolveBeanClass

  1. if (className != null) {
  2. // bean 属性值
  3. Object evaluated = evaluateBeanDefinitionString(className, mbd);
  4. if (!className.equals(evaluated)) {
  5. // A dynamically resolved expression, supported as of 4.2...
  6. if (evaluated instanceof Class) {
  7. return (Class<?>) evaluated;
  8. }
  9. else if (evaluated instanceof String) {
  10. className = (String) evaluated;
  11. freshResolve = true;
  12. }
  13. else {
  14. throw new IllegalStateException("Invalid class name expression result: " + evaluated);
  15. }
  16. }
  17. if (freshResolve) {
  18. // When resolving against a temporary class loader, exit early in order
  19. // to avoid storing the resolved Class in the bean definition.
  20. if (dynamicLoader != null) {
  21. try {
  22. return dynamicLoader.loadClass(className);
  23. }
  24. catch (ClassNotFoundException ex) {
  25. if (logger.isTraceEnabled()) {
  26. logger.trace("Could not load class [" + className + "] from " + dynamicLoader + ": " + ex);
  27. }
  28. }
  29. }
  30. return ClassUtils.forName(className, dynamicLoader);
  31. }
  32. }
  • 目前为止我们解析了 第一句话 Object evaluated = evaluateBeanDefinitionString(className, mbd); 接下来往下走看一下具体的 class 返回对象
  1. 类型等于 class 直接返回
  2. 类型等于 String 的两种返回方式
    1. ClassLoader.loadClass 返回
    2. ClassUtils.forName 返回
      1. 底层方法为 java.lang.Class#forName(java.lang.String, boolean, java.lang.ClassLoader)
resolveBeanClass
  • 回到doResolveBeanClass方法中.最后一行

    1. // Resolve regularly, caching the result in the BeanDefinition...
    2. return mbd.resolveBeanClass(beanClassLoader);
  1. @Nullable
  2. public Class<?> resolveBeanClass(@Nullable ClassLoader classLoader) throws ClassNotFoundException {
  3. // 获取beanClassName
  4. String className = getBeanClassName();
  5. if (className == null) {
  6. return null;
  7. }
  8. // 加载类
  9. Class<?> resolvedClass = ClassUtils.forName(className, classLoader);
  10. this.beanClass = resolvedClass;
  11. // 返回
  12. return resolvedClass;
  13. }
  • 获取 beanClassName
  1. @Override
  2. @Nullable
  3. public String getBeanClassName() {
  4. Object beanClassObject = this.beanClass;
  5. if (beanClassObject instanceof Class) {
  6. return ((Class<?>) beanClassObject).getName();
  7. }
  8. else {
  9. return (String) beanClassObject;
  10. }
  11. }
  • 回到createBeanInstance
    • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
  1. // 返回一个用来创建bean实例的回调接口
  2. // Supplier get 直接获取bean对象
  3. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  4. if (instanceSupplier != null) {
  5. return obtainFromSupplier(instanceSupplier, beanName);
  6. }
obtainFromSupplier
  1. protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
  2. Object instance;
  3. // 获取当前的bean实例
  4. String outerBean = this.currentlyCreatedBean.get();
  5. // 设置当前处理的beanName
  6. this.currentlyCreatedBean.set(beanName);
  7. try {
  8. // 从 Supplier 中获取
  9. instance = instanceSupplier.get();
  10. }
  11. finally {
  12. if (outerBean != null) {
  13. // 如果 currentlyCreatedBean 取不到设置
  14. this.currentlyCreatedBean.set(outerBean);
  15. }
  16. else {
  17. // 移除
  18. this.currentlyCreatedBean.remove();
  19. }
  20. }
  21. if (instance == null) {
  22. // supplier 中获取不到, 将实例设置为 NullBean
  23. instance = new NullBean();
  24. }
  25. // beanWrapper 包装
  26. BeanWrapper bw = new BeanWrapperImpl(instance);
  27. // beanWrapper 实例化后的操作
  28. initBeanWrapper(bw);
  29. return bw;
  30. }
  • Supplier 代码如下
  1. @FunctionalInterface
  2. public interface Supplier<T> {
  3. /**
  4. * Gets a result.
  5. *
  6. * @return a result
  7. */
  8. T get();
  9. }
initBeanWrapper
  1. protected void initBeanWrapper(BeanWrapper bw) {
  2. // 设置转换服务
  3. bw.setConversionService(getConversionService());
  4. // 注册自定义属性编辑器
  5. registerCustomEditors(bw);
  6. }
registerCustomEditors
  1. protected void registerCustomEditors(PropertyEditorRegistry registry) {
  2. PropertyEditorRegistrySupport registrySupport =
  3. (registry instanceof PropertyEditorRegistrySupport ? (PropertyEditorRegistrySupport) registry : null);
  4. if (registrySupport != null) {
  5. registrySupport.useConfigValueEditors();
  6. }
  7. if (!this.propertyEditorRegistrars.isEmpty()) {
  8. for (PropertyEditorRegistrar registrar : this.propertyEditorRegistrars) {
  9. try {
  10. // 属性编辑器,注册自定义属性编辑器
  11. registrar.registerCustomEditors(registry);
  12. }
  13. catch (BeanCreationException ex) {
  14. Throwable rootCause = ex.getMostSpecificCause();
  15. if (rootCause instanceof BeanCurrentlyInCreationException) {
  16. BeanCreationException bce = (BeanCreationException) rootCause;
  17. String bceBeanName = bce.getBeanName();
  18. if (bceBeanName != null && isCurrentlyInCreation(bceBeanName)) {
  19. if (logger.isDebugEnabled()) {
  20. logger.debug("PropertyEditorRegistrar [" + registrar.getClass().getName() +
  21. "] failed because it tried to obtain currently created bean '" +
  22. ex.getBeanName() + "': " + ex.getMessage());
  23. }
  24. onSuppressedException(ex);
  25. continue;
  26. }
  27. }
  28. throw ex;
  29. }
  30. }
  31. }
  32. if (!this.customEditors.isEmpty()) {
  33. this.customEditors.forEach((requiredType, editorClass) ->
  34. registry.registerCustomEditor(requiredType, BeanUtils.instantiateClass(editorClass)));
  35. }
  36. }
  • 最后调用

    org.springframework.beans.support.ResourceEditorRegistrar#registerCustomEditors

registerCustomEditors
  1. @Override
  2. public void registerCustomEditors(PropertyEditorRegistry registry) {
  3. ResourceEditor baseEditor = new ResourceEditor(this.resourceLoader, this.propertyResolver);
  4. doRegisterEditor(registry, Resource.class, baseEditor);
  5. doRegisterEditor(registry, ContextResource.class, baseEditor);
  6. doRegisterEditor(registry, InputStream.class, new InputStreamEditor(baseEditor));
  7. doRegisterEditor(registry, InputSource.class, new InputSourceEditor(baseEditor));
  8. doRegisterEditor(registry, File.class, new FileEditor(baseEditor));
  9. doRegisterEditor(registry, Path.class, new PathEditor(baseEditor));
  10. doRegisterEditor(registry, Reader.class, new ReaderEditor(baseEditor));
  11. doRegisterEditor(registry, URL.class, new URLEditor(baseEditor));
  12. ClassLoader classLoader = this.resourceLoader.getClassLoader();
  13. doRegisterEditor(registry, URI.class, new URIEditor(classLoader));
  14. doRegisterEditor(registry, Class.class, new ClassEditor(classLoader));
  15. doRegisterEditor(registry, Class[].class, new ClassArrayEditor(classLoader));
  16. if (this.resourceLoader instanceof ResourcePatternResolver) {
  17. doRegisterEditor(registry, Resource[].class,
  18. new ResourceArrayPropertyEditor((ResourcePatternResolver) this.resourceLoader, this.propertyResolver));
  19. }
  20. }
doRegisterEditor
  1. private void doRegisterEditor(PropertyEditorRegistry registry, Class<?> requiredType, PropertyEditor editor) {
  2. if (registry instanceof PropertyEditorRegistrySupport) {
  3. // 属性编辑器覆盖默认的编辑器
  4. ((PropertyEditorRegistrySupport) registry).overrideDefaultEditor(requiredType, editor);
  5. }
  6. else {
  7. // 注册自定义的属性编辑器
  8. registry.registerCustomEditor(requiredType, editor);
  9. }
  10. }

覆盖默认编辑器

  1. public void overrideDefaultEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
  2. if (this.overriddenDefaultEditors == null) {
  3. this.overriddenDefaultEditors = new HashMap<>();
  4. }
  5. this.overriddenDefaultEditors.put(requiredType, propertyEditor);
  6. }
  • registerCustomEditor
  1. @Override
  2. public void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath, PropertyEditor propertyEditor) {
  3. if (requiredType == null && propertyPath == null) {
  4. throw new IllegalArgumentException("Either requiredType or propertyPath is required");
  5. }
  6. if (propertyPath != null) {
  7. if (this.customEditorsForPath == null) {
  8. this.customEditorsForPath = new LinkedHashMap<>(16);
  9. }
  10. this.customEditorsForPath.put(propertyPath, new CustomEditorHolder(propertyEditor, requiredType));
  11. }
  12. else {
  13. if (this.customEditors == null) {
  14. this.customEditors = new LinkedHashMap<>(16);
  15. }
  16. // 放入 customEditors map对象中
  17. this.customEditors.put(requiredType, propertyEditor);
  18. this.customEditorCache = null;
  19. }
  20. }

到这里 createBeanInstance 流程已经完毕

回到doCreateBean 方法

  1. // beanWrapper 是否存在
  2. if (instanceWrapper == null) {
  3. // 创建 bean 实例
  4. instanceWrapper = createBeanInstance(beanName, mbd, args);
  5. }
  6. // 获取 实例
  7. final Object bean = instanceWrapper.getWrappedInstance();
  8. // beanWrapper中存储的实例.class
  9. Class<?> beanType = instanceWrapper.getWrappedClass();
  10. if (beanType != NullBean.class) {
  11. mbd.resolvedTargetType = beanType;
  12. }

紧接着两行代码 获取 bean 实例 和 beanType

applyMergedBeanDefinitionPostProcessors
  1. synchronized (mbd.postProcessingLock) {
  2. if (!mbd.postProcessed) {
  3. try {
  4. // 后置方法执行 BeanPostProcessor
  5. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  6. }
  7. catch (Throwable ex) {
  8. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  9. "Post-processing of merged bean definition failed", ex
  10. );
  11. }
  12. mbd.postProcessed = true;
  13. }
  14. }
  • applyMergedBeanDefinitionPostProcessors 方法会执行所有的后置方法.
  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. }
addSingletonFactory
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory

  • 继续回到 doCreateBean

  1. // Eagerly cache singletons to be able to resolve circular references
  2. // even when triggered by lifecycle interfaces like BeanFactoryAware.
  3. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
  4. isSingletonCurrentlyInCreation(beanName));
  5. // 单例对象暴露
  6. if (earlySingletonExposure) {
  7. if (logger.isTraceEnabled()) {
  8. logger.trace("Eagerly caching bean '" + beanName +
  9. "' to allow for resolving potential circular references");
  10. }
  11. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  12. }
  • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory

    添加单例工厂

  1. protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
  2. Assert.notNull(singletonFactory, "Singleton factory must not be null");
  3. synchronized (this.singletonObjects) {
  4. if (!this.singletonObjects.containsKey(beanName)) {
  5. // 添加单例对象工厂
  6. this.singletonFactories.put(beanName, singletonFactory);
  7. // 删除单例BeanName
  8. this.earlySingletonObjects.remove(beanName);
  9. // 注册单例beanName
  10. this.registeredSingletons.add(beanName);
  11. }
  12. }
  13. }
getEarlyBeanReference
  • org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#getEarlyBeanReference
  1. @Override
  2. public Object getEarlyBeanReference(Object bean, String beanName) {
  3. // 尝试获取缓存
  4. Object cacheKey = getCacheKey(bean.getClass(), beanName);
  5. // 加入缓存
  6. this.earlyProxyReferences.put(cacheKey, bean);
  7. // 代理对象
  8. return wrapIfNecessary(bean, beanName, cacheKey);
  9. }
  • wrapIfNecessary
  1. protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
  2. // 这个bean是否处理过
  3. if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
  4. return bean;
  5. }
  6. // 这个bean是否需要代理
  7. if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
  8. return bean;
  9. }
  10. // 1.bean.class是否是Spring接口类型 2. 是否为 AutowireCapableBeanFactory 接口
  11. if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
  12. // 向代理集合中插入值
  13. this.advisedBeans.put(cacheKey, Boolean.FALSE);
  14. return bean;
  15. }
  16. // Create proxy if we have advice.
  17. // 增强方法获取
  18. Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
  19. // 增强方法不为空
  20. if (specificInterceptors != DO_NOT_PROXY) {
  21. // 向代理集合中插入值
  22. this.advisedBeans.put(cacheKey, Boolean.TRUE);
  23. // 创建代理
  24. Object proxy = createProxy(
  25. bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
  26. // 代理类型
  27. this.proxyTypes.put(cacheKey, proxy.getClass());
  28. return proxy;
  29. }
  30. this.advisedBeans.put(cacheKey, Boolean.FALSE);
  31. return bean;
  32. }
  • 回到下面代码中

    1. if (earlySingletonExposure) {
    2. if (logger.isTraceEnabled()) {
    3. logger.trace("Eagerly caching bean '" + beanName +
    4. "' to allow for resolving potential circular references");
    5. }
    6. // 添加单例工厂
    7. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    8. }
    • 上述方法就是将结果 bean 放入
populateBean
  1. // Initialize the bean instance.
  2. Object exposedObject = bean;
  3. try {
  4. populateBean(beanName, mbd, instanceWrapper);
  5. exposedObject = initializeBean(beanName, exposedObject, mbd);
  6. }
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
  • 设置属性值

  • 概述一下方法

    • 自动注入的两种实现

      1. 根据类型
      2. 根据名称
    • xml 中的属性标签设置

      1. <bean class="org.source.hot.spring.overview.ioc.bean.init.UserBean">
      2. <property name="age" value="30"/>
      3. </bean>
    1. {
    2. if (bw == null) {
    3. if (mbd.hasPropertyValues()) {
    4. throw new BeanCreationException(
    5. mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
    6. }
    7. else {
    8. // Skip property population phase for null instance.
    9. return;
    10. }
    11. }
    12. // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
    13. // state of the bean before properties are set. This can be used, for example,
    14. // to support styles of field injection.
    15. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    16. for (BeanPostProcessor bp : getBeanPostProcessors()) {
    17. if (bp instanceof InstantiationAwareBeanPostProcessor) {
    18. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    19. if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    20. return;
    21. }
    22. }
    23. }
    24. }
    25. PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
    26. // 获取自动注入的值
    27. int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    28. // 自动注入
    29. if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
    30. MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    31. // Add property values based on autowire by name if applicable.
    32. if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
    33. // 按照名称注入
    34. autowireByName(beanName, mbd, bw, newPvs);
    35. }
    36. // Add property values based on autowire by type if applicable.
    37. if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
    38. // 按照类型注入
    39. autowireByType(beanName, mbd, bw, newPvs);
    40. }
    41. pvs = newPvs;
    42. }
    43. boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    44. boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    45. PropertyDescriptor[] filteredPds = null;
    46. if (hasInstAwareBpps) {
    47. if (pvs == null) {
    48. pvs = mbd.getPropertyValues();
    49. }
    50. for (BeanPostProcessor bp : getBeanPostProcessors()) {
    51. if (bp instanceof InstantiationAwareBeanPostProcessor) {
    52. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    53. PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
    54. if (pvsToUse == null) {
    55. if (filteredPds == null) {
    56. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    57. }
    58. pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    59. if (pvsToUse == null) {
    60. return;
    61. }
    62. }
    63. pvs = pvsToUse;
    64. }
    65. }
    66. }
    67. if (needsDepCheck) {
    68. if (filteredPds == null) {
    69. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    70. }
    71. // 以来检查
    72. checkDependencies(beanName, mbd, filteredPds, pvs);
    73. }
    74. if (pvs != null) {
    75. // 应用属性
    76. applyPropertyValues(beanName, mbd, bw, pvs);
    77. }
    78. }

pvs 属性如下

image-20200903150738285

applyPropertyValues
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyPropertyValues
  • 属性设置
  1. protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
  2. if (pvs.isEmpty()) {
  3. return;
  4. }
  5. if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
  6. ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
  7. }
  8. MutablePropertyValues mpvs = null;
  9. // 没有解析的属性
  10. List<PropertyValue> original;
  11. if (pvs instanceof MutablePropertyValues) {
  12. mpvs = (MutablePropertyValues) pvs;
  13. if (mpvs.isConverted()) {
  14. // Shortcut: use the pre-converted values as-is.
  15. try {
  16. bw.setPropertyValues(mpvs);
  17. return;
  18. }
  19. catch (BeansException ex) {
  20. throw new BeanCreationException(
  21. mbd.getResourceDescription(), beanName, "Error setting property values", ex);
  22. }
  23. }
  24. original = mpvs.getPropertyValueList();
  25. }
  26. else {
  27. original = Arrays.asList(pvs.getPropertyValues());
  28. }
  29. // 自定义转换器
  30. TypeConverter converter = getCustomTypeConverter();
  31. if (converter == null) {
  32. converter = bw;
  33. }
  34. // 创建BeanDefinitionValueResolver
  35. BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
  36. // Create a deep copy, resolving any references for values.
  37. // 解析后的对象集合
  38. List<PropertyValue> deepCopy = new ArrayList<>(original.size());
  39. boolean resolveNecessary = false;
  40. for (PropertyValue pv : original) {
  41. // 解析过的属性
  42. if (pv.isConverted()) {
  43. deepCopy.add(pv);
  44. }
  45. // 没有解析过的属性
  46. else {
  47. // 属性名称
  48. String propertyName = pv.getName();
  49. // 属性值,直接读取到的
  50. Object originalValue = pv.getValue();
  51. if (originalValue == AutowiredPropertyMarker.INSTANCE) {
  52. Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
  53. if (writeMethod == null) {
  54. throw new IllegalArgumentException("Autowire marker for property without write method: " + pv);
  55. }
  56. originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);
  57. }
  58. // 解析值
  59. Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
  60. Object convertedValue = resolvedValue;
  61. /**
  62. * 1. isWritableProperty: 属性可写
  63. * 2. isNestedOrIndexedProperty: 是否循环嵌套
  64. */
  65. boolean convertible = bw.isWritableProperty(propertyName) &&
  66. !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
  67. if (convertible) {
  68. // 转换器解析
  69. convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
  70. }
  71. // Possibly store converted value in merged bean definition,
  72. // in order to avoid re-conversion for every created bean instance.
  73. if (resolvedValue == originalValue) {
  74. if (convertible) {
  75. pv.setConvertedValue(convertedValue);
  76. }
  77. deepCopy.add(pv);
  78. }
  79. // 类型解析
  80. else if (convertible && originalValue instanceof TypedStringValue &&
  81. !((TypedStringValue) originalValue).isDynamic() &&
  82. !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
  83. pv.setConvertedValue(convertedValue);
  84. deepCopy.add(pv);
  85. }
  86. else {
  87. resolveNecessary = true;
  88. deepCopy.add(new PropertyValue(pv, convertedValue));
  89. }
  90. }
  91. }
  92. if (mpvs != null && !resolveNecessary) {
  93. mpvs.setConverted();
  94. }
  95. // Set our (possibly massaged) deep copy.
  96. try {
  97. bw.setPropertyValues(new MutablePropertyValues(deepCopy));
  98. }
  99. catch (BeansException ex) {
  100. throw new BeanCreationException(
  101. mbd.getResourceDescription(), beanName, "Error setting property values", ex);
  102. }
  103. }

属性设置后跳出方法回到 doCreateBean

  1. try {
  2. populateBean(beanName, mbd, instanceWrapper);
  3. exposedObject = initializeBean(beanName, exposedObject, mbd);
  4. }

image-20200903150930186

initializeBean
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

  • 我们可以看一下整个代码的流程

    1. aware 接口的执行
    2. BeanPostProcessor 前置方法执行
    3. bean 实例化
    4. BeanPostProcessor 后置方法执行
    5. 返回 bean
  1. protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
  2. if (System.getSecurityManager() != null) {
  3. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  4. invokeAwareMethods(beanName, bean);
  5. return null;
  6. }, getAccessControlContext());
  7. }
  8. else {
  9. // aware 接口执行
  10. invokeAwareMethods(beanName, bean);
  11. }
  12. Object wrappedBean = bean;
  13. if (mbd == null || !mbd.isSynthetic()) {
  14. // BeanPostProcessor 前置方法执行
  15. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  16. }
  17. try {
  18. // 执行实例化函数
  19. invokeInitMethods(beanName, wrappedBean, mbd);
  20. }
  21. catch (Throwable ex) {
  22. throw new BeanCreationException(
  23. (mbd != null ? mbd.getResourceDescription() : null),
  24. beanName, "Invocation of init method failed", ex
  25. );
  26. }
  27. if (mbd == null || !mbd.isSynthetic()) {
  28. // BeanPostProcessor 后置方法执行
  29. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  30. }
  31. return wrappedBean;
  32. }
  • Aware 接口的执行
  1. private void invokeAwareMethods(final String beanName, final Object bean) {
  2. if (bean instanceof Aware) {
  3. if (bean instanceof BeanNameAware) {
  4. ((BeanNameAware) bean).setBeanName(beanName);
  5. }
  6. if (bean instanceof BeanClassLoaderAware) {
  7. ClassLoader bcl = getBeanClassLoader();
  8. if (bcl != null) {
  9. ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
  10. }
  11. }
  12. if (bean instanceof BeanFactoryAware) {
  13. ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
  14. }
  15. }
  16. }j
  • 前置方法执行

    1. @Override
    2. public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
    3. throws BeansException {
    4. Object result = existingBean;
    5. for (BeanPostProcessor processor : getBeanPostProcessors()) {
    6. Object current = processor.postProcessBeforeInitialization(result, beanName);
    7. if (current == null) {
    8. return result;
    9. }
    10. result = current;
    11. }
    12. return result;
    13. }
  • 后置方法执行

    1. @Override
    2. public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
    3. throws BeansException {
    4. Object result = existingBean;
    5. for (BeanPostProcessor processor : getBeanPostProcessors()) {
    6. // 执行 spring 容器中 BeanPostProcessor
    7. Object current = processor.postProcessAfterInitialization(result, beanName);
    8. if (current == null) {
    9. return result;
    10. }
    11. result = current;
    12. }
    13. return result;
    14. }
invokeInitMethods
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
  • 初始化方法重点看一下
  1. protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
  2. throws Throwable {
  3. // 是否是 InitializingBean
  4. boolean isInitializingBean = (bean instanceof InitializingBean);
  5. // 是否存在方法 "afterPropertiesSet"
  6. if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
  7. if (logger.isTraceEnabled()) {
  8. logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
  9. }
  10. if (System.getSecurityManager() != null) {
  11. try {
  12. // 执行 afterPropertiesSet
  13. AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
  14. ((InitializingBean) bean).afterPropertiesSet();
  15. return null;
  16. }, getAccessControlContext());
  17. }
  18. catch (PrivilegedActionException pae) {
  19. throw pae.getException();
  20. }
  21. }
  22. else {
  23. ((InitializingBean) bean).afterPropertiesSet();
  24. }
  25. }
  26. if (mbd != null && bean.getClass() != NullBean.class) {
  27. String initMethodName = mbd.getInitMethodName();
  28. if (StringUtils.hasLength(initMethodName) &&
  29. !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
  30. !mbd.isExternallyManagedInitMethod(initMethodName)) {
  31. // 自定义的 init method
  32. invokeCustomInitMethod(beanName, bean, mbd);
  33. }
  34. }
  35. }

image-20200903153057321

我们现在的 bean 不是InitializingBean 会走自定义的init-mthod方法

  • 做一下改造实体对象

    1. public void initMethod() {
    2. this.name = "abc";
    3. this.age = 10;
    4. }
  1. <bean class="org.source.hot.spring.overview.ioc.bean.init.UserBean"
  2. init-method="initMethod">
  3. <property name="age" value="30"/>
  4. </bean>
  • 观察 initMethodName 会变成 标签属性init-method 的内容. 接下来就是通过反射执行方法

image-20200903153432559

  • 在执行方法前将 bean 的信息先做一次截图

    image-20200903153533141

  • 如果按照我们代码中的编写方式 bean 的属性会被覆盖

    image-20200903153617353

invokeCustomInitMethod
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeCustomInitMethod
  • 执行 自定义的init-method 方法
  1. protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
  2. throws Throwable {
  3. // 获取 initMethod 名称
  4. String initMethodName = mbd.getInitMethodName();
  5. Assert.state(initMethodName != null, "No init method set");
  6. // 反射获取方法
  7. Method initMethod = (mbd.isNonPublicAccessAllowed() ?
  8. BeanUtils.findMethod(bean.getClass(), initMethodName) :
  9. ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));
  10. // 方法是否存在判断
  11. if (initMethod == null) {
  12. if (mbd.isEnforceInitMethod()) {
  13. throw new BeanDefinitionValidationException("Could not find an init method named '" +
  14. initMethodName + "' on bean with name '" + beanName + "'");
  15. }
  16. else {
  17. if (logger.isTraceEnabled()) {
  18. logger.trace("No default init method named '" + initMethodName +
  19. "' found on bean with name '" + beanName + "'");
  20. }
  21. // Ignore non-existent default lifecycle methods.
  22. return;
  23. }
  24. }
  25. if (logger.isTraceEnabled()) {
  26. logger.trace("Invoking init method '" + initMethodName + "' on bean with name '" + beanName + "'");
  27. }
  28. // 尝试获取接口方法
  29. Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod);
  30. if (System.getSecurityManager() != null) {
  31. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  32. ReflectionUtils.makeAccessible(methodToInvoke);
  33. return null;
  34. });
  35. try {
  36. // 反射调用
  37. AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->
  38. methodToInvoke.invoke(bean), getAccessControlContext());
  39. }
  40. catch (PrivilegedActionException pae) {
  41. InvocationTargetException ex = (InvocationTargetException) pae.getException();
  42. throw ex.getTargetException();
  43. }
  44. }
  45. else {
  46. try {
  47. // 反射调用
  48. ReflectionUtils.makeAccessible(methodToInvoke);
  49. methodToInvoke.invoke(bean);
  50. }
  51. catch (InvocationTargetException ex) {
  52. throw ex.getTargetException();
  53. }
  54. }
  55. }
getInterfaceMethodIfPossible
  • org.springframework.util.ClassUtils#getInterfaceMethodIfPossible
  1. public static Method getInterfaceMethodIfPossible(Method method) {
  2. // 是不是 public
  3. // 是不是 接口
  4. if (!Modifier.isPublic(method.getModifiers()) || method.getDeclaringClass().isInterface()) {
  5. return method;
  6. }
  7. // 放入init-method 缓存
  8. return interfaceMethodCache.computeIfAbsent(method, key -> {
  9. Class<?> current = key.getDeclaringClass();
  10. while (current != null && current != Object.class) {
  11. // 当前类的 接口列表
  12. Class<?>[] ifcs = current.getInterfaces();
  13. for (Class<?> ifc : ifcs) {
  14. try {
  15. // 从接口中获取方法
  16. return ifc.getMethod(key.getName(), key.getParameterTypes());
  17. }
  18. catch (NoSuchMethodException ex) {
  19. // ignore
  20. }
  21. }
  22. current = current.getSuperclass();
  23. }
  24. return key;
  25. });
  26. }
  • 跳出这个方法initializeBean 回到下面代码

    1. try {
    2. populateBean(beanName, mbd, instanceWrapper);
    3. exposedObject = initializeBean(beanName, exposedObject, mbd);
    4. }
    • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

      其实到此 bean 已经创建完成可以直接返回了.

  • 再往外层跳

    org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

    1. if (mbd.isSingleton()) {
    2. // 判断是否是单例
    3. sharedInstance = getSingleton(beanName, () -> {
    4. try {
    5. return createBean(beanName, mbd, args);
    6. }
    7. catch (BeansException ex) {
    8. // Explicitly remove instance from singleton cache: It might have been put there
    9. // eagerly by the creation process, to allow for circular reference resolution.
    10. // Also remove any beans that received a temporary reference to the bean.
    11. destroySingleton(beanName);
    12. throw ex;
    13. }
    14. });
    15. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    16. }
    • 单例对象的创建 bean 已经完成啦…
  • 其他的两种创建,其本质还是 createBean 方法的调用.

  1. // 原型模式创建
  2. else if (mbd.isPrototype()) {
  3. // It's a prototype -> create a new instance.
  4. Object prototypeInstance = null;
  5. try {
  6. beforePrototypeCreation(beanName);
  7. prototypeInstance = createBean(beanName, mbd, args);
  8. }
  9. finally {
  10. afterPrototypeCreation(beanName);
  11. }
  12. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  13. }
  14. else {
  15. String scopeName = mbd.getScope();
  16. final Scope scope = this.scopes.get(scopeName);
  17. if (scope == null) {
  18. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  19. }
  20. try {
  21. Object scopedInstance = scope.get(beanName, () -> {
  22. beforePrototypeCreation(beanName);
  23. try {
  24. return createBean(beanName, mbd, args);
  25. }
  26. finally {
  27. afterPrototypeCreation(beanName);
  28. }
  29. });
  30. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  31. }
  32. catch (IllegalStateException ex) {
  33. throw new BeanCreationException(beanName,
  34. "Scope '" + scopeName + "' is not active for the current thread; consider " +
  35. "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
  36. ex);
  37. }
  38. }
  • 再往外面跳一层 回到 getBean 方法.

  • 终于 getBean 方法底层调用分析结束.