@Resource注解详细分析
-
@Resource是由CommonAnnotationBeanPostProcessor后置处理器处理的。(备注:如果这里有问题可以留言,下次再专门讲解)
-
在bean依赖注入的时候,会给我们的变量进行赋值,但是赋值的前提要先找到我们的值。
CommonAnnotationBeanPostProcessor的autowireResource()方法就在根据我们配置寻找
。 -
从下面代码可以大致分析得出
-
如果@Resource没有指定name,但是我们就根据变量名称判断**factory.containsBean(name)**看容器中是否存在我们想要的:
如果没有就走上面逻辑:根据类型就去容器中查找我们需要的值
如果有就走下面的逻辑:就根据名称就去容器中查找我们需要的值
-
如果@Resource指定name,isDefaultName就是false,就走下面的逻辑根据名称去容器中查找我们需要的值。没有找到就是抛出异常NoSuchBeanDefinitionException。
-
是自己的原创, 如果讲解有误或者不清楚的地方,麻烦各位指出,谢谢大家的支持。
-
Resource resource = ae.getAnnotation(Resource.class);
//获取Resource注解name属性值
String resourceName = resource.name();
Class<?> resourceType = resource.type();
//如果我们name属性有值,就不是默认值就是false,如果没值默认""就是true。
this.isDefaultName = !StringUtils.hasLength(resourceName);
//条件上有两个重要的条件isDefaultName(上面讲解的)和factory.containsBean(name)
if (this.fallbackToDefaultTypeMatch && element.isDefaultName &&
factory instanceof AutowireCapableBeanFactory && !factory.containsBean(name)) {
autowiredBeanNames = new LinkedHashSet<String>();
//里面的逻辑是根据类型查找的
resource = ((AutowireCapableBeanFactory) factory).resolveDependency(
element.getDependencyDescriptor(), requestingBeanName, autowiredBeanNames, null);
}
else {
//里面的逻辑是根据name查找的
resource = factory.getBean(name, element.lookupType);
autowiredBeanNames = Collections.singleton(name);
}
注意:@Resource按类型查找和@Autowired是一样的逻辑,也会存在匹配不到或者匹配到多个的逻辑,详细可以看@Autowired注解详细分析。