@Autowired 注解原理分析

127 阅读8分钟

Chapter 1 @Autowired 注解原理分析

1 AbstractAutowireCapableBeanFactory#createBean

AbstractAutowireCapableBeanFactory#createBean 此类的中心方法:创建 bean 实例,填充 bean 实例,应用后处理器等。

/**
 * Central method of this class: creates a bean instance,
 * populates the bean instance, applies post-processors, etc.
 * @see #doCreateBean
 */
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
        throws BeanCreationException {
​
    if (logger.isTraceEnabled()) {
        logger.trace("Creating instance of bean '" + beanName + "'");
    }
    RootBeanDefinition mbdToUse = mbd;
​
    // Make sure bean class is actually resolved at this point, and
    // clone the bean definition in case of a dynamically resolved Class
    // which cannot be stored in the shared merged bean definition.
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }
​
    // Prepare method overrides.
    try {
        mbdToUse.prepareMethodOverrides();
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                beanName, "Validation of method overrides failed", ex);
    }
​
    try {
        // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
        // 让 BeanPostProcessors 有机会返回一个代理而不是目标 bean 实例
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        if (bean != null) {
            return bean;
        }
    }
    catch (Throwable ex) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                "BeanPostProcessor before instantiation of bean failed", ex);
    }
​
    try {
        // 核心方法,执行 Bean 的创建
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        if (logger.isTraceEnabled()) {
            logger.trace("Finished creating instance of bean '" + beanName + "'");
        }
        return beanInstance;
    }
    catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
        // A previously detected exception with proper bean creation context already,
        // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
        throw ex;
    }
    catch (Throwable ex) {
        throw new BeanCreationException(
                mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
    }
}

Source Path

2 AbstractAutowireCapableBeanFactory#doCreateBean

AbstractAutowireCapableBeanFactory#doCreateBean

  • beanName 需要注入的 BeanName (superUser)
  • RootBeanDefinition 需要注入对象的 RootBeanDefinition (superUser 对应的RootBeanDefinition)
  • args 参数
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
        throws BeanCreationException {
​
    // Instantiate the bean.
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        // 单例的情况下,需要移除缓存
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        // 使用其默认构造函数实例化给定的 bean,返回的是一个 Bean 的包装器
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    // 从 Bean 的包装器中获取 Bean 实例
    final Object bean = instanceWrapper.getWrappedInstance();
    // 获取 Bean 实例对应的类型
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        // 赋值 Bean 的类型给 resolvedTargetType
        mbd.resolvedTargetType = beanType;
    }
​
    // Allow post-processors to modify the merged bean definition.
    // 允许后处理器修改合并的 bean 定义。
    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            // 没有执行过扩展方法才能走此处
            try {
                // 运行合并 BeanDefinition 的 PostProcessor 自定义扩展点
                applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            catch (Throwable ex) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Post-processing of merged bean definition failed", ex);
            }
            // 将postProcessed 自定义扩展点执行标识修改为 true,代表已经执行过扩展回调方法
            mbd.postProcessed = true;
        }
    }
​
    // Eagerly cache singletons to be able to resolve circular references
    // even when triggered by lifecycle interfaces like BeanFactoryAware.
    // 循环引用处理,之后再做分析
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
            isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        if (logger.isTraceEnabled()) {
            logger.trace("Eagerly caching bean '" + beanName +
                    "' to allow for resolving potential circular references");
        }
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }
​
    // Initialize the bean instance.
    // 初始化赋值 bean 的属性
    Object exposedObject = bean;
    try {
        // 填充 Bean 实例
        populateBean(beanName, mbd, instanceWrapper);
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    catch (Throwable ex) {
        if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
            throw (BeanCreationException) ex;
        }
        else {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
        }
    }
​
    if (earlySingletonExposure) {
        Object earlySingletonReference = getSingleton(beanName, false);
        if (earlySingletonReference != null) {
            if (exposedObject == bean) {
                exposedObject = earlySingletonReference;
            }
            else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                String[] dependentBeans = getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
                for (String dependentBean : dependentBeans) {
                    if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }
                if (!actualDependentBeans.isEmpty()) {
                    throw new BeanCurrentlyInCreationException(beanName,
                            "Bean with name '" + beanName + "' has been injected into other beans [" +
                            StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                            "] in its raw version as part of a circular reference, but has eventually been " +
                            "wrapped. This means that said other beans do not use the final version of the " +
                            "bean. This is often the result of over-eager type matching - consider using " +
                            "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                }
            }
        }
    }
​
    // Register bean as disposable.
    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanCreationException(
                mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }
​
    return exposedObject;
}

Source Path

3 MergedBeanDefinitionPostProcessor

MergedBeanDefinitionPostProcessor 是 Spring 提供的一个扩展点接口。

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
​
    /**
     * 当前类和父类属性合并后调用
     */
    void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
​
    /**
     * 重置 BeanDefinition
     */
    default void resetBeanDefinition(String beanName) {
    }
​
}

Source Path

4 AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors

调用所有扩展了MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition的方法

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof MergedBeanDefinitionPostProcessor) {
            // MergedBeanDefinitionPostProcessor 类型的扩展器执行
            MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
            // 进行自定义扩展方法调用
            // 在依赖注入时
            bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
        }
    }
}
​
/**
 * Return the list of BeanPostProcessors that will get applied
 * to beans created with this factory.
 * 返回 BeanPostProcessor 的列表,这些 BeanPostProcessor 将被应用到使用这个工厂创建的 bean
 */
public List<BeanPostProcessor> getBeanPostProcessors() {
    return this.beanPostProcessors;
}

Image 1 当BeanPostProcessor 为 AutowiredAnnotationBeanPostProcessor 类型时,会调用 AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition Source Path

5 @Autowired注解处理类型

构造方法中标志了在解析时,需要处理的类型有那些:

  • Autowired
  • Value
  • Inject 等这三种类型
public AutowiredAnnotationBeanPostProcessor() {
    this.autowiredAnnotationTypes.add(Autowired.class);
    this.autowiredAnnotationTypes.add(Value.class);
    try {
        this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
                ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
        logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
    }
    catch (ClassNotFoundException ex) {
        // JSR-330 API not available - simply skip.
    }
}

Source Path

6 AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition

将给定的 clazz 中去将标注了 @Autowired 注解的字段和方法构建成一个元数据进行返回。 该方法具有缓存,如果有缓存,则从缓存中取,如果没有缓存,将重新构建元数据对象,并存入缓存。

@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
    // 查找自定注入的元数据
    InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
    metadata.checkConfigMembers(beanDefinition);
}

Source Path

7 AutowiredAnnotationBeanPostProcessor#findAutowiringMetadata

AutowiredAnnotationBeanPostProcessor#findAutowiringMetadata 该方法主要是从给定的 clazz 中去将标注了 @Autowired 注解的字段和方法构建成一个元数据进行返回。 该方法会将元数据进行缓存,如果缓存中有,则直接获取,没有则进行返回。 此处还进行 synchronized 加锁操作,对数据是否需要刷新进行两次校验。

private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {
    // Fall back to class name as cache key, for backwards compatibility with custom callers.
    // 缓存 key 的名称,取值为传递进来的 beanName,beanName 如果为空的话,则取 class 的名称
    String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
    // Quick check on the concurrent map first, with minimal locking.
    InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
    if (InjectionMetadata.needsRefresh(metadata, clazz)) {
        synchronized (this.injectionMetadataCache) {
            metadata = this.injectionMetadataCache.get(cacheKey);
            if (InjectionMetadata.needsRefresh(metadata, clazz)) {
                if (metadata != null) {
                    metadata.clear(pvs);
                }
                // 将 clazz 类中声明l @Autowired 注解的字段和方法构建成一个对象
                metadata = buildAutowiringMetadata(clazz);
                // 将构建好的元数据添加到缓存中
                this.injectionMetadataCache.put(cacheKey, metadata);
            }
        }
    }
    return metadata;
}

Source Path

8 AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {
    // 如果不是候选者类则直接返回
    if (!AnnotationUtils.isCandidateClass(clazz, this.autowiredAnnotationTypes)) {
        return InjectionMetadata.EMPTY;
    }
​
    // 元数据中需要注入的字段集合
    List<InjectionMetadata.InjectedElement> elements = new ArrayList<>();
    // 目标类
    Class<?> targetClass = clazz;
    // 这里采用了do-while 循环查询
    // 循环终止的条件为:targetClass != null && targetClass != Object.class
    // 前往下一次循环的变量: targetClass = targetClass.getSuperclass(); 父类class
    do {
        // 当前类的元数据需要注入的字段集合(不包含父类)
        final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>();
        
        // 在本地字段中去做
        // 此处的理解为:遍历 targetClass 中所有声明的字段, 并将字段作为参数调用回调方法
        // 所以此处的 field 为targetClass 中声明的每一个字段
        ReflectionUtils.doWithLocalFields(targetClass, field -> {
            // 查找字段上的 Autowired 注解
            MergedAnnotation<?> ann = findAutowiredAnnotation(field);
            if (ann != null) {
                // 如果字段上标注了 static 关键字,这里会将该字段给过滤掉
                if (Modifier.isStatic(field.getModifiers())) {
                    if (logger.isInfoEnabled()) {
                        logger.info("Autowired annotation is not supported on static fields: " + field);
                    }
                    return;
                }
                // 获取 @Autowired 注解中的 required属性
                boolean required = determineRequiredStatus(ann);
                // 将当前字段添加的 currElements 集合中
                currElements.add(new AutowiredFieldElement(field, required));
            }
        });
        
        // 此处和上面一致,不过构建的是声明了 @Autowired 注解的方法
        ReflectionUtils.doWithLocalMethods(targetClass, method -> {
            Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
            if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
                return;
            }
            MergedAnnotation<?> ann = findAutowiredAnnotation(bridgedMethod);
            if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
                if (Modifier.isStatic(method.getModifiers())) {
                    if (logger.isInfoEnabled()) {
                        logger.info("Autowired annotation is not supported on static methods: " + method);
                    }
                    return;
                }
                if (method.getParameterCount() == 0) {
                    if (logger.isInfoEnabled()) {
                        logger.info("Autowired annotation should only be used on methods with parameters: " +
                                method);
                    }
                }
                boolean required = determineRequiredStatus(ann);
                PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
                currElements.add(new AutowiredMethodElement(method, required, pd));
            }
        });
        // 将当前字段集合添加到总集合中
        elements.addAll(0, currElements);
        // 遍历父类
        targetClass = targetClass.getSuperclass();
    }
    // 循环的终止条件
    while (targetClass != null && targetClass != Object.class);
    // 返回查找到的元素
    return InjectionMetadata.forElements(elements, clazz);
}

Source Path

9 ReflectionUtils#doWithLocalFields

doWithLocalFields 遍历所有声明的字段,并调用回调方法将当前字段传递给回调方法

getDeclaredFields(clazz) 该方法为获取给定类中的所有声明的字段

public static void doWithLocalFields(Class<?> clazz, FieldCallback fc) {
    for (Field field : getDeclaredFields(clazz)) {
        try {
            fc.doWith(field);
        }
        catch (IllegalAccessException ex) {
            throw new IllegalStateException("Not allowed to access field '" + field.getName() + "': " + ex);
        }
    }
}
​
private static Field[] getDeclaredFields(Class<?> clazz) {
    Assert.notNull(clazz, "Class must not be null");
    Field[] result = declaredFieldsCache.get(clazz);
    if (result == null) {
        try {
            result = clazz.getDeclaredFields();
            declaredFieldsCache.put(clazz, (result.length == 0 ? EMPTY_FIELD_ARRAY : result));
        }
        catch (Throwable ex) {
            throw new IllegalStateException("Failed to introspect Class [" + clazz.getName() +
                    "] from ClassLoader [" + clazz.getClassLoader() + "]", ex);
        }
    }
    return result;
}

Source Path

10 AbstractAutowireCapableBeanFactory#populateBean

使用 bean 定义中的属性值填充给定 BeanWrapper 中的 bean 实例

/**
 * Populate the bean instance in the given BeanWrapper with the property values
 * from the bean definition.
 * @param beanName the name of the bean
 * @param mbd the bean definition for the bean
 * @param bw the BeanWrapper with bean instance
 */
@SuppressWarnings("deprecation")  // for postProcessPropertyValues
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    // 对 Bean 的包装器进行校验
    if (bw == null) {
        if (mbd.hasPropertyValues()) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
        }
        else {
            // Skip property population phase for null instance.
            return;
        }
    }
​
    // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
    // state of the bean before properties are set. This can be used, for example,
    // to support styles of field injection.
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                    return;
                }
            }
        }
    }
​
    // 获取属性值列表 PropertyValues 实现了 Iterable 接口,可以直接使用迭代器迭代
    PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
    // 获取自动注入的模式
    int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    // 根据名称或者 setter 方法注入
    if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        // Add property values based on autowire by name if applicable.
        if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
            // 根据名称注入
            autowireByName(beanName, mbd, bw, newPvs);
        }
        // Add property values based on autowire by type if applicable.
        if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
            // 根据 setter 方法注入
            autowireByType(beanName, mbd, bw, newPvs);
        }
        pvs = newPvs;
    }
​
    // 有实例化 Bean 的 PostProcessor 自定义扩展点吗
    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
​
    // 属性描述数组
    PropertyDescriptor[] filteredPds = null;
    if (hasInstAwareBpps) {
        if (pvs == null) {
            // 属性值
            pvs = mbd.getPropertyValues();
        }
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                // 转化为 InstantiationAwareBeanPostProcessor
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                // 依赖注入时调用的方法为 AutowiredAnnotationBeanPostProcessor#postProcessProperties
                PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    if (filteredPds == null) {
                        filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                    }
                    pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                    if (pvsToUse == null) {
                        return;
                    }
                }
                pvs = pvsToUse;
            }
        }
    }
    if (needsDepCheck) {
        if (filteredPds == null) {
            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
        }
        checkDependencies(beanName, mbd, filteredPds, pvs);
    }
​
    if (pvs != null) {
        applyPropertyValues(beanName, mbd, bw, pvs);
    }
}
​
/**
 * 已经实例化意识的
 **/
protected boolean hasInstantiationAwareBeanPostProcessors() {
    return this.hasInstantiationAwareBeanPostProcessors;
}

Image 1 属性值列表 属性值列表 属性值列表 Source Path

11 AutowiredAnnotationBeanPostProcessor#postProcessProperties

@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
    InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
    try {
        metadata.inject(bean, beanName, pvs);
    }
    catch (BeanCreationException ex) {
        throw ex;
    }
    catch (Throwable ex) {
        throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
    }
    return pvs;
}

Source Path

12 InjectionMetadata#inject

注入的方法

public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
    Collection<InjectedElement> checkedElements = this.checkedElements;
    Collection<InjectedElement> elementsToIterate =
            (checkedElements != null ? checkedElements : this.injectedElements);
    if (!elementsToIterate.isEmpty()) {
        for (InjectedElement element : elementsToIterate) {
            if (logger.isTraceEnabled()) {
                logger.trace("Processing injected element of bean '" + beanName + "': " + element);
            }
            element.inject(target, beanName, pvs);
        }
    }
}

Source Path

13 AutowiredFieldElement#inject

AutowiredAnnotationBeanPostProcessor#inject 注入方法

/**
 * bean 需要注入的类,如果是配置类,通过 @Configuration 或者 register(class) 的方式进行注入
 * @Description TODO
 * @Author WQ
 * @Date 2022/6/24 14:46
 * @Version 1.0
 */
@Override
protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
    // 标注了 @Autowired 注解的字段或者 @Value 的字段,在前面的操作中对没有这两个注解的字段已经进行了过滤
    Field field = (Field) this.member;
    Object value;
    if (this.cached) {
        value = resolvedCachedArgument(beanName, this.cachedFieldValue);
    }
    else {
        // 根据 field、this.required(是否为必须的)合成 DependencyDescriptor
        DependencyDescriptor desc = new DependencyDescriptor(field, this.required);
        desc.setContainingClass(bean.getClass());
        Set<String> autowiredBeanNames = new LinkedHashSet<>(1);
        Assert.state(beanFactory != null, "No BeanFactory available");
        TypeConverter typeConverter = beanFactory.getTypeConverter();
        try {
            // 依赖处理的方法
            value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
        }
        catch (BeansException ex) {
            throw new UnsatisfiedDependencyException(null, beanName, new InjectionPoint(field), ex);
        }
        synchronized (this) {
            if (!this.cached) {
                if (value != null || this.required) {
                    this.cachedFieldValue = desc;
                    registerDependentBeans(beanName, autowiredBeanNames);
                    if (autowiredBeanNames.size() == 1) {
                        String autowiredBeanName = autowiredBeanNames.iterator().next();
                        if (beanFactory.containsBean(autowiredBeanName) &&
                                beanFactory.isTypeMatch(autowiredBeanName, field.getType())) {
                            this.cachedFieldValue = new ShortcutDependencyDescriptor(
                                    desc, autowiredBeanName, field.getType());
                        }
                    }
                }
                else {
                    this.cachedFieldValue = null;
                }
                this.cached = true;
            }
        }
    }
    if (value != null) {
        // 反射设置权限
        ReflectionUtils.makeAccessible(field);
        // 反射给字段赋值
        field.set(bean, value);
    }
}

Source Path