@Resource源码解析

本文主要探讨了@Resource注解的工作原理,特别是在自动注入过程中的差异。与@Autowired不同,@Resource首先尝试按名称进行注入,然后才按类型。详细分析了@Resource如何寻找注入点,以及在找不到匹配名称时如何切换到按类型查找。此外,提到了@Lazy的支持以及对JNDI工厂的兼容性。通过源码解析,揭示了@Resource注解看似先按名称后按类型的注入逻辑实则是由条件判断导致的误解。
摘要由CSDN通过智能技术生成

概述

@Resource这个注解在实现上很类似,但是于@Autowired在一般情况下是先byType,再byName,但是@Resource则相反,通知@Resource还可以单独制定注入的bean的名字,具体实现也是通过一个后置处理器进行实现的,这个后置处理是CommonAnnotationBeanPostProcessor

@Resource的自动注入

对于@Resource的自动注入而言,其注入的方法也是postProcessProperties这个方法

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

这个方法可以说是和@Autowired对应后置处理器的postProcessProperties一模一样了
首先是先找到所有的注入点InjectionMetadata,的inject方法

首先来看看@Resource是如何找注入点的

	private InjectionMetadata buildResourceMetadata(final Class<?> clazz) {
   
		...
			else if (field.isAnnotationPresent(Resource.class)) {
   
					if (Modifier.isStatic(field.getModifiers())) {
   
						throw new IllegalStateException("@Resource annotation is not supported on static fields");
					}
					if (!this.ignoredResourceTypes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值