成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Spring中的AutowireCandidateResolver的具體使用詳解

瀏覽:133日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久精品视频一区二区| 国产欧美精品一区二区三区四区| 精品亚洲免费视频| 丝瓜av网站精品一区二区| 亚洲精品成a人| 亚洲欧美激情插| 中文字幕免费观看一区| 国产午夜精品久久久久久免费视| 日韩免费高清电影| 91麻豆精品国产91久久久更新时间| 亚洲一区激情| 国产美女诱惑一区二区| 99国产精品久久久久久久成人热| av一区二区三区在线| 国产很黄免费观看久久| 国产经典欧美精品| 从欧美一区二区三区| 成人网在线免费视频| 床上的激情91.| 从欧美一区二区三区| 国产成人在线电影| 国产精品18久久久久| 国产91精品精华液一区二区三区 | 久久综合成人精品亚洲另类欧美| 欧美一区二区免费| 精品日韩一区二区三区| 久久综合狠狠综合久久激情| 欧美成ee人免费视频| 欧美二区三区的天堂| 成人午夜在线免费| 欧美午夜精品| 夜夜嗨av一区二区三区网站四季av| 亚洲啪啪综合av一区二区三区| 欧美国产三区| 久久精品人人做| 欧美激情第六页| 中文字幕的久久| 91视频观看免费| 日本一区二区三级电影在线观看 | 图片区日韩欧美亚洲| 色激情天天射综合网| 国产精品全国免费观看高清| 亚洲欧美日韩另类精品一区二区三区| 久久福利视频一区二区| 久久亚洲一区| 国产一区二区三区四区五区入口| 亚洲一区二区免费视频| 日韩欧美中文一区| 一本一本a久久| 成人性视频网站| 好吊视频一区二区三区四区| 亚洲欧洲韩国日本视频| 国产精品视区| 五月天一区二区| 欧美性受xxxx黑人xyx性爽| 国产一区二区三区高清播放| 精品久久免费看| 欧美日产一区二区三区在线观看| 亚洲欧美在线高清| 久久大逼视频| 精品亚洲国内自在自线福利| 精品国产123| 成人av网址在线| 国产精品视频第一区| 国产一区二区你懂的| 麻豆91在线播放| 日韩一级黄色片| 欧美日韩亚洲一区二区三区在线观看 | 欧美大片日本大片免费观看| 91蜜桃网址入口| 亚洲一本大道在线| 欧美日韩精品一区视频| 97se亚洲国产综合在线| 一区二区久久久久| 在线一区二区三区四区五区| 粉嫩高潮美女一区二区三区 | 人人精品人人爱| 日韩欧美色电影| 农村妇女精品| 亚洲精品欧美综合四区| 欧美色爱综合网| 国产精品主播直播| 国产精品久久久久久久久免费丝袜 | 欧美一区二区精品久久911| 成人在线视频首页| 国产精品丝袜黑色高跟| 一区二区精品在线| 免费在线观看成人| 欧美电影免费观看完整版| 91蜜桃在线观看| 亚洲欧洲精品一区二区三区不卡| 国产精品久久波多野结衣| 久久精品99国产精品| 日韩欧美国产一区在线观看| 在线免费观看欧美| 美国欧美日韩国产在线播放| 精品国产精品网麻豆系列| 亚洲国内精品| 久久99精品国产麻豆婷婷| 国产偷国产偷亚洲高清人白洁| 亚洲精品无人区| 蜜臀av性久久久久蜜臀aⅴ| 日韩欧美在线不卡| 欧美激情 亚洲a∨综合| 亚洲综合免费观看高清在线观看| 在线观看免费一区| 成人小视频免费观看| 国产精品激情偷乱一区二区∴| 一本到不卡精品视频在线观看| 粉嫩aⅴ一区二区三区四区五区 | 久久一区二区三区超碰国产精品| 国产成人鲁色资源国产91色综| 国产精品久久三| 一本久久a久久精品亚洲| 成人网男人的天堂| 亚洲狠狠丁香婷婷综合久久久| 欧美美女直播网站| 欧美日韩喷水| 久久黄色级2电影| 国产精品成人免费| 欧美日韩一区二区在线观看视频| 欧美日韩精品免费看| 久久精工是国产品牌吗| 中文字幕一区二区三| 欧美视频一区二区在线观看| 欧美性色综合| 免费观看在线色综合| 国产欧美中文在线| 欧洲生活片亚洲生活在线观看| 91毛片在线观看| 日本伊人午夜精品| 国产女人18水真多18精品一级做| 久久aⅴ国产紧身牛仔裤| 成人一区二区三区中文字幕| 五月激情六月综合| 中文字幕乱码一区二区免费| 欧美精品日韩精品| 国产日韩亚洲欧美精品| av中文字幕一区| 久久国产人妖系列| 亚洲视频你懂的| 日韩区在线观看| 老牛影视一区二区三区| 欧美体内she精视频在线观看| 紧缚捆绑精品一区二区| 中文字幕在线观看不卡视频| 欧美一级片在线| 国产欧美日本| 成人做爰69片免费看网站| 婷婷丁香激情综合| 国产精品视频一二| 日韩欧美亚洲国产另类| 久久久777| 极品av少妇一区二区| 成人午夜视频网站| 精品亚洲成a人| 亚洲午夜成aⅴ人片| 欧美—级在线免费片| 欧美一区二区国产| 色综合久久久网| 亚洲欧洲一区二区在线观看| 暴力调教一区二区三区| 韩国女主播成人在线| 亚洲精品国产第一综合99久久 | 丁香婷婷综合五月| 日韩高清在线电影| 亚洲精品美腿丝袜| 欧美激情一区不卡| 欧美mv日韩mv亚洲| 欧美精品丝袜中出| 在线影视一区二区三区| 亚洲一区日韩| 欧美激情五月| 国产98色在线|日韩| 久久国产夜色精品鲁鲁99| 亚洲小说春色综合另类电影| 国产精品天干天干在线综合| 亚洲精品在线网站| 欧美日韩国产欧美日美国产精品| 麻豆久久精品| 国产一区二区三区成人欧美日韩在线观看| 欧美久久久久| 99久久精品国产精品久久| 黄网站免费久久| 欧美aaaaaa午夜精品| 日韩综合小视频| 亚洲成人动漫精品| 亚洲影院在线观看| 国产精品久久福利| 国产欧美日韩不卡| 久久色在线视频| 欧美电视剧在线看免费| 在线播放亚洲一区| 777久久久精品| 精品区一区二区| 日韩欧美一卡二卡| 欧美一区二区三区不卡| 欧美卡1卡2卡| 欧美四级电影在线观看| 久久亚洲一区|