日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring中的AutowireCandidateResolver的具體使用詳解

瀏覽:169日期:2023-09-09 13:15:51

接口定義

用于推斷一個特定的beanDefinition是否能作為指定依賴的候選者的策略接口

public interface AutowireCandidateResolver {// 默認情況下直接根據bd中的定義返回,如果沒有進行特殊配置的話為truedefault boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {return bdHolder.getBeanDefinition().isAutowireCandidate();} // 指定的依賴是否是必要的default boolean isRequired(DependencyDescriptor descriptor) {return descriptor.isRequired();} // QualifierAnnotationAutowireCandidateResolver做了實現,判斷是否有@Qualifier注解 // 一共有兩種注解: // 1.Spring內置的@Qualifier注解,org.springframework.beans.factory.annotation.Qualifier // 2.添加了JSR-330相關依賴,javax.inject.Qualifier注解 // 默認情況下返回falsedefault boolean hasQualifier(DependencyDescriptor descriptor) {return false;} // QualifierAnnotationAutowireCandidateResolver做了實現 // 獲取一個該依賴一個建議的值@Nullabledefault Object getSuggestedValue(DependencyDescriptor descriptor) {return null;} // 對某個依賴我們想要延遲注入,但是在創建Bean的過程中這個依賴又是必須的 // 通過下面這個方法就能為延遲注入的依賴先生成一個代理注入到bean中@Nullabledefault Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, @Nullable String beanName) {return null;}}

繼承關系

Spring中的AutowireCandidateResolver的具體使用詳解

可以看到繼承關系都是單層的,我們就一個一個往下看

SimpleAutowireCandidateResolver

相比于接口沒有什么區別,實現也就是父接口中的默認實現,一般也不會使用這個類

public class SimpleAutowireCandidateResolver implements AutowireCandidateResolver {@Overridepublic boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {return bdHolder.getBeanDefinition().isAutowireCandidate();}@Overridepublic boolean isRequired(DependencyDescriptor descriptor) {return descriptor.isRequired();}@Override@Nullablepublic Object getSuggestedValue(DependencyDescriptor descriptor) {return null;}@Override@Nullablepublic Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, @Nullable String beanName) {return null;}}

GenericTypeAwareAutowireCandidateResolver

額外增加了對泛型的處理能力

public class GenericTypeAwareAutowireCandidateResolver extends SimpleAutowireCandidateResolverimplements BeanFactoryAware {@Nullableprivate BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}@Nullableprotected final BeanFactory getBeanFactory() {return this.beanFactory;}@Overridepublic boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {if (!super.isAutowireCandidate(bdHolder, descriptor)) {// 如果bd中已經配置了這個bean不做為依賴進行注入的話,直接返回falsereturn false;} // 檢查泛型是否匹配return checkGenericTypeMatch(bdHolder, descriptor);}}

QualifierAnnotationAutowireCandidateResolver

增加了對@Qualifier注解以及@Value注解的處理能力

public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwareAutowireCandidateResolver {private final Set<Class<? extends Annotation>> qualifierTypes = new LinkedHashSet<>(2);// @Value注解private Class<? extends Annotation> valueAnnotationType = Value.class; // @Qualifier注解@SuppressWarnings('unchecked')public QualifierAnnotationAutowireCandidateResolver() {this.qualifierTypes.add(Qualifier.class);try {this.qualifierTypes.add((Class<? extends Annotation>) ClassUtils.forName('javax.inject.Qualifier',QualifierAnnotationAutowireCandidateResolver.class.getClassLoader()));}catch (ClassNotFoundException ex) {// JSR-330 API not available - simply skip.}}// .......@Overridepublic boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) { // 類型上已經匹配了boolean match = super.isAutowireCandidate(bdHolder, descriptor);if (match) { // 還需要判斷是否滿足@Qualifier注解的要求match = checkQualifiers(bdHolder, descriptor.getAnnotations());if (match) {MethodParameter methodParam = descriptor.getMethodParameter();if (methodParam != null) {Method method = methodParam.getMethod();if (method == null || void.class == method.getReturnType()) {match = checkQualifiers(bdHolder, methodParam.getMethodAnnotations());}}}}return match;}// ..... // 是否是@Qualifier注解protected boolean isQualifier(Class<? extends Annotation> annotationType) {for (Class<? extends Annotation> qualifierType : this.qualifierTypes) {if (annotationType.equals(qualifierType) || annotationType.isAnnotationPresent(qualifierType)) {return true;}}return false;}@Override@Nullablepublic Object getSuggestedValue(DependencyDescriptor descriptor) {Object value = findValue(descriptor.getAnnotations());if (value == null) {MethodParameter methodParam = descriptor.getMethodParameter();if (methodParam != null) {value = findValue(methodParam.getMethodAnnotations());}}return value;} // 查找@Value注解@Nullableprotected Object findValue(Annotation[] annotationsToSearch) {if (annotationsToSearch.length > 0) { AnnotationAttributes attr = AnnotatedElementUtils.getMergedAnnotationAttributes(AnnotatedElementUtils.forAnnotations(annotationsToSearch), this.valueAnnotationType);if (attr != null) {return extractValue(attr);}}return null;} // 獲取@Value注解中的值protected Object extractValue(AnnotationAttributes attr) {Object value = attr.get(AnnotationUtils.VALUE);if (value == null) {throw new IllegalStateException('Value annotation must have a value attribute');}return value;}}

ContextAnnotationAutowireCandidateResolver

這個類是最底層的子類,集成了所有的方法,并且額外提供了對依賴進行延遲處理的能力

public class ContextAnnotationAutowireCandidateResolver extends QualifierAnnotationAutowireCandidateResolver { // 如果依賴需要進行延遲處理,那么構建一個代理對象先注入到bean中,不會直接去創建依賴對象@Override@Nullablepublic Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, @Nullable String beanName) {return (isLazy(descriptor) ? buildLazyResolutionProxy(descriptor, beanName) : null);} // 依賴是否需要延遲處理protected boolean isLazy(DependencyDescriptor descriptor) {for (Annotation ann : descriptor.getAnnotations()) {Lazy lazy = AnnotationUtils.getAnnotation(ann, Lazy.class);if (lazy != null && lazy.value()) {return true;}}MethodParameter methodParam = descriptor.getMethodParameter();if (methodParam != null) {Method method = methodParam.getMethod();if (method == null || void.class == method.getReturnType()) {Lazy lazy = AnnotationUtils.getAnnotation(methodParam.getAnnotatedElement(), Lazy.class);if (lazy != null && lazy.value()) {return true;}}}return false;} // 構建延遲處理的代理對象protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, final @Nullable String beanName) {final DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) getBeanFactory();// 創建了一個TargetSourceTargetSource ts = new TargetSource() {@Overridepublic Class<?> getTargetClass() {return descriptor.getDependencyType();}@Overridepublic boolean isStatic() {return false;} // target是我們實際想要使用的對象,如果不進行延遲處理,那么注入到bean中的應該就是這個對象 // 但是因為要進行延遲注入依賴,所有會向外暴露一個TargetSource,這個TargetSource的目標為實際想要使用的對象,生成代理時會基于TargetSource進行生成。在運行期間(完成注入后)我們使用這個延遲處理的依賴時實際調用的會是target中的方法。@Overridepublic Object getTarget() {Object target = beanFactory.doResolveDependency(descriptor, beanName, null, null);if (target == null) {Class<?> type = getTargetClass();if (Map.class == type) {return Collections.emptyMap();}else if (List.class == type) {return Collections.emptyList();}else if (Set.class == type || Collection.class == type) {return Collections.emptySet();}throw new NoSuchBeanDefinitionException(descriptor.getResolvableType(),'Optional dependency not present for lazy injection point');}return target;}@Overridepublic void releaseTarget(Object target) {}};// 使用ProxyFactory,給TargetSource生成一個代理ProxyFactory pf = new ProxyFactory();pf.setTargetSource(ts);Class<?> dependencyType = descriptor.getDependencyType(); // 如果依賴的類型是一個接口,需要讓代理類也實現這個接口if (dependencyType.isInterface()) {pf.addInterface(dependencyType);} // 生成代理return pf.getProxy(beanFactory.getBeanClassLoader());}}

總結

SimpleAutowireCandidateResolver:單純的將接口變成了可實例化的類,方法實現跟接口保持一致 GenericTypeAwareAutowireCandidateResolver: 判斷泛型是否匹配,支持泛型依賴注入(From Spring4.0) QualifierAnnotationAutowireCandidateResolver :處理 @Qualifier 和 @Value 注解 ContextAnnotationAutowireCandidateResolver :處理依賴級別的 @Lazy 注解,重寫了getLazyResolutionProxyIfNecessary 方法。

到此這篇關于Spring中的AutowireCandidateResolver的具體使用詳解的文章就介紹到這了,更多相關Spring AutowireCandidateResolver內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文无码久久精品| 欧美丝袜一区| 国产一区丝袜| 喷白浆一区二区| 日韩成人亚洲| 国产一卡不卡| 婷婷亚洲精品| 亚洲一区国产| 国产一区导航| 99精品电影| 国产一区国产二区国产三区| 日韩激情视频网站| 亚洲二区三区不卡| 国产精品对白久久久久粗| 婷婷中文字幕一区| 国产一区二区精品福利地址| 综合激情在线| 国产情侣一区在线| 久久久久一区| 亚洲1区在线| 成人精品视频| 99精品99| 国产精品一国产精品| 日韩av自拍| 91久久久久| 麻豆91精品视频| 欧美精品一区二区久久| 日韩午夜黄色| 久久99久久久精品欧美| 国产一区二区三区自拍| 日韩高清电影免费| 99国产精品免费视频观看| 黄色日韩精品| 宅男在线一区| 国精品产品一区| 欧美日韩中出| 国产精品女主播一区二区三区| 亚洲欧美网站在线观看| 久久视频精品| 国产一区二区三区四区五区| 日韩手机在线| 国产91久久精品一区二区| 国产日韩在线观看视频| 久久一级电影| 日韩美女一区二区三区在线观看| 久久久蜜桃一区二区人| bbw在线视频| 欧美丰满日韩| 韩国三级一区| 最新日韩欧美| 国产一区二区三区四区五区传媒| 中文字幕一区二区三区日韩精品| 午夜精品免费| 精品72久久久久中文字幕| 黄色亚洲免费| 黄色日韩在线| 丁香婷婷久久| 欧美/亚洲一区| 欧美午夜三级| 美女久久一区| 国产日产精品一区二区三区四区的观看方式| 国产aⅴ精品一区二区四区| 首页国产欧美久久| 日本欧美不卡| 国产91在线精品| 国产精品国码视频| 日韩成人一级| 国产农村妇女精品一二区 | 色综合视频一区二区三区日韩 | 精品精品99| 亚洲男人在线| 中文国产一区| 夜夜嗨网站十八久久| 99久久99久久精品国产片果冰| 久久精品一区二区国产| 国产精品多人| 国产精品一区二区av交换| 亚洲精品系列| 日韩高清欧美激情| 视频在线观看91| 国产成人精品福利| 日韩国产91| 亚洲激情偷拍| 亚洲自啪免费| 蜜桃视频在线网站| 麻豆一区二区在线| 欧美黄色一区| 久久男人天堂| 精品久久视频| 久久精品国产一区二区| 日韩中文字幕无砖| 亚洲网址在线观看| 亚洲黄色在线| 热三久草你在线| 久久激情五月激情| 成人av二区| 一区二区三区网站| 91精品一区| 精品精品久久| 欧美jjzz| 亚洲欧美久久| 国产精品一区二区三区四区在线观看| 日韩精品亚洲专区在线观看| 日本99精品| 日韩中文首页| 美女精品在线| 久久爱www成人| 欧美日中文字幕| 日本少妇精品亚洲第一区| 成人午夜网址| 日韩综合精品| 日韩黄色免费网站| 伊人久久视频| 日本一区免费网站| 在线看片福利| 日韩动漫一区| 女同性一区二区三区人了人一| 亚洲精品观看| 久久亚洲精品中文字幕蜜潮电影| 91成人在线精品视频| 99精品网站| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 免费人成精品欧美精品| 蜜桃久久久久| 日韩毛片网站| 国产粉嫩在线观看| 久久精品国产久精国产爱| 91欧美极品| 国产精品久久久久久av公交车| 日韩精品成人| 亚洲精品第一| 免费人成在线不卡| 蜜桃av一区二区| 最新国产精品视频| 狠狠色综合网| 一区二区91| 爽爽淫人综合网网站| 欧美一级专区| 亚洲香蕉久久| 日本国产亚洲| 精品国产一区二区三区av片| 国产精品极品| 国产一区二区三区天码| 新版的欧美在线视频| 91亚洲成人| 一区二区电影| 日本久久一区| 视频一区在线视频| 午夜在线一区| 91中文字幕精品永久在线| 青草国产精品| 国产精品原创| 婷婷综合在线| 欧美日韩伊人| 日韩欧美综合| 日韩精品一区第一页| 色综合视频一区二区三区日韩 | 国产精品第一| 日本蜜桃在线观看视频| 婷婷色综合网| 国产乱码精品一区二区三区亚洲人| 日韩精品电影| 精品日韩视频| 久久激情av| 美女尤物国产一区| 日韩综合精品| 九九久久国产| 久久国产精品久久久久久电车| 日韩av一区二区三区四区| 欧美一级一区| 精品欧美激情在线观看| 九九综合在线| 精品国产99| 日韩一二三区在线观看| 一区免费在线| 午夜国产精品视频| 韩国三级一区| 99精品在线观看| 日韩在线二区| 欧美日韩视频网站| 免费一区二区三区在线视频| 日韩视频一区| 免费在线观看日韩欧美| 一区三区视频| 国产精品黄色片| 综合一区二区三区| 中文字幕中文字幕精品| 欧美日韩xxxx| 亚洲欧美日韩综合国产aⅴ| 日韩一区三区| 另类小说一区二区三区| 亚洲精品亚洲人成在线观看| 激情欧美日韩一区| 亚洲1234区| 天堂а√在线最新版中文在线| 在线日韩成人| 国产丝袜一区| 国产一区二区三区免费在线| 欧美亚洲日本精品| 欧美韩日一区|