Spring Boot如何处理@Resource示例分析

 更新时间:2023年07月06日 11:34:24   作者:子瞻  
这篇文章主要为大家介绍了Spring Boot如何处理@Resource示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

先造一个测试用例

public class TransactionServiceTest {
    @Resource
    private IQrcodeAdScheduleService qrcodeAdScheduleService;
}

启动Spring Boot调用栈信息

图1

解析@Resource对应的bean信息

由上图可知,在创建完bean实例后,通过applyMergedBeanDefinitionPostProcessors()修改beanDefinition结构(针对这种场景可以理解为解析@Resource对应的bean信息)

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof MergedBeanDefinitionPostProcessor) {
                MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
                //执行CommonAnnotationBeanPostProcessor类postProcessMergedBeanDefinition()
                bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
            }
        }
    }

图2

CommonAnnotationBeanPostProcessor

有图2可知,处理@Resource的PostProcessor是“CommonAnnotationBeanPostProcessor”,然后看一下CommonAnnotationBeanPostProcessor的部分细节:

private InjectionMetadata buildResourceMetadata(final Class<?> clazz) {
        LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();
        Class<?> targetClass = clazz;
        do {
            final LinkedList<InjectionMetadata.InjectedElement> currElements =
                    new LinkedList<>();
            ReflectionUtils.doWithLocalFields(targetClass, field -> {
                if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@WebServiceRef annotation is not supported on static fields");
                    }
                    currElements.add(new WebServiceRefElement(field, field, null));
                }
                else if (ejbRefClass != null && field.isAnnotationPresent(ejbRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@EJB annotation is not supported on static fields");
                    }
                    currElements.add(new EjbRefElement(field, field, null));
                }
                //解析@Resource.class
                else if (field.isAnnotationPresent(Resource.class)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@Resource annotation is not supported on static fields");
                    }
                    if (!ignoredResourceTypes.contains(field.getType().getName())) {
                        currElements.add(new ResourceElement(field, field, null));
                    }
                }
            });
}

上面的代码块出现了期待已久的“Resource.class”关键字,我们就放心了。

我们再回顾一下,
其流程是这样的:在AbstractAutowireCapableBeanFactory.populateBean()->ibp.postProcessPropertyValue()->CommonAnnotationBeanPostProcessor.postProcessPropertyValue()去实例化@Resource作用的bean;

除了和处理@Autowired不是一个PostProcessor(处理@AutoWireds是用这个“AutowiredAnnotationBeanPostProcessor”PostProcessor)其他处理流程和@Autowired的处理流程一毛一样啊!

以上就是Spring Boot如何处理@Resource示例分析的详细内容,更多关于Spring Boot处理@Resource的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMVC拦截器快速掌握下篇

    SpringMVC拦截器快速掌握下篇

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2022-08-08
  • Java Web学习教程之Hibernate And MyBatis的理解

    Java Web学习教程之Hibernate And MyBatis的理解

    这篇文章主要给大家介绍了关于Java Web学习教程之Hibernate And MyBatis的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们来一起学习学习吧。
    2018-04-04
  • IDEA 中使用 Big Data Tools 连接大数据组件

    IDEA 中使用 Big Data Tools 连接大数据组件

    本文主要介绍了IDEA 中使用 Big Data Tools 连接大数据组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java之int数组声明与初始化方式

    Java之int数组声明与初始化方式

    这篇文章主要介绍了Java之int数组声明与初始化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java源码重读之ConcurrentHashMap详解

    Java源码重读之ConcurrentHashMap详解

    ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构。本文将从源码角度带大家深入了解一下ConcurrentHashMap的使用,需要的可以收藏一下
    2023-05-05
  • 如何使用Java 8中DateTimeFormatter类型转换日期格式详解

    如何使用Java 8中DateTimeFormatter类型转换日期格式详解

    这篇文章主要介绍了如何使用Java 8中DateTimeFormatter类型转换日期格式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java实现断点下载服务端与客户端的示例代码

    Java实现断点下载服务端与客户端的示例代码

    这篇文章主要为大家介绍了如何实现服务端(Spring Boot)与客户端(Android)的断点下载与下载续传功能,文中的示例代码讲解详细,需要的可以参考一下
    2022-08-08
  • java spring mvc处理器映射器介绍

    java spring mvc处理器映射器介绍

    这篇文章主要介绍了java spring mvc处理器映射器,文章围绕equestMapping解析映射介绍展开源码内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • java实现去除ArrayList重复字符串

    java实现去除ArrayList重复字符串

    本文主要介绍了java实现去除ArrayList重复字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Java超详细讲解设计模式之一的单例模式

    Java超详细讲解设计模式之一的单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-03-03

最新评论