色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring中的AutowireCandidateResolver的具體使用詳解

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

接口定義

用于推斷一個(gè)特定的beanDefinition是否能作為指定依賴(lài)的候選者的策略接口

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

繼承關(guān)系

Spring中的AutowireCandidateResolver的具體使用詳解

可以看到繼承關(guān)系都是單層的,我們就一個(gè)一個(gè)往下看

SimpleAutowireCandidateResolver

相比于接口沒(méi)有什么區(qū)別,實(shí)現(xiàn)也就是父接口中的默認(rèn)實(shí)現(xiàn),一般也不會(huì)使用這個(gè)類(lèi)

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

額外增加了對(duì)泛型的處理能力

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中已經(jīng)配置了這個(gè)bean不做為依賴(lài)進(jìn)行注入的話,直接返回falsereturn false;} // 檢查泛型是否匹配return checkGenericTypeMatch(bdHolder, descriptor);}}

QualifierAnnotationAutowireCandidateResolver

增加了對(duì)@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) { // 類(lèi)型上已經(jīng)匹配了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

這個(gè)類(lèi)是最底層的子類(lèi),集成了所有的方法,并且額外提供了對(duì)依賴(lài)進(jìn)行延遲處理的能力

public class ContextAnnotationAutowireCandidateResolver extends QualifierAnnotationAutowireCandidateResolver { // 如果依賴(lài)需要進(jìn)行延遲處理,那么構(gòu)建一個(gè)代理對(duì)象先注入到bean中,不會(huì)直接去創(chuàng)建依賴(lài)對(duì)象@Override@Nullablepublic Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, @Nullable String beanName) {return (isLazy(descriptor) ? buildLazyResolutionProxy(descriptor, beanName) : null);} // 依賴(lài)是否需要延遲處理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;} // 構(gòu)建延遲處理的代理對(duì)象protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, final @Nullable String beanName) {final DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) getBeanFactory();// 創(chuàng)建了一個(gè)TargetSourceTargetSource ts = new TargetSource() {@Overridepublic Class<?> getTargetClass() {return descriptor.getDependencyType();}@Overridepublic boolean isStatic() {return false;} // target是我們實(shí)際想要使用的對(duì)象,如果不進(jìn)行延遲處理,那么注入到bean中的應(yīng)該就是這個(gè)對(duì)象 // 但是因?yàn)橐M(jìn)行延遲注入依賴(lài),所有會(huì)向外暴露一個(gè)TargetSource,這個(gè)TargetSource的目標(biāo)為實(shí)際想要使用的對(duì)象,生成代理時(shí)會(huì)基于TargetSource進(jìn)行生成。在運(yùn)行期間(完成注入后)我們使用這個(gè)延遲處理的依賴(lài)時(shí)實(shí)際調(diào)用的會(huì)是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生成一個(gè)代理ProxyFactory pf = new ProxyFactory();pf.setTargetSource(ts);Class<?> dependencyType = descriptor.getDependencyType(); // 如果依賴(lài)的類(lèi)型是一個(gè)接口,需要讓代理類(lèi)也實(shí)現(xiàn)這個(gè)接口if (dependencyType.isInterface()) {pf.addInterface(dependencyType);} // 生成代理return pf.getProxy(beanFactory.getBeanClassLoader());}}

總結(jié)

SimpleAutowireCandidateResolver:?jiǎn)渭兊膶⒔涌谧兂闪丝蓪?shí)例化的類(lèi),方法實(shí)現(xiàn)跟接口保持一致 GenericTypeAwareAutowireCandidateResolver: 判斷泛型是否匹配,支持泛型依賴(lài)注入(From Spring4.0) QualifierAnnotationAutowireCandidateResolver :處理 @Qualifier 和 @Value 注解 ContextAnnotationAutowireCandidateResolver :處理依賴(lài)級(jí)別的 @Lazy 注解,重寫(xiě)了getLazyResolutionProxyIfNecessary 方法。

到此這篇關(guān)于Spring中的AutowireCandidateResolver的具體使用詳解的文章就介紹到這了,更多相關(guān)Spring AutowireCandidateResolver內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产成人精品.一二区 | 国产人成久久久精品 | 97久久国语露脸精品对白 | 亚洲自拍成人 | 免费一级肉体全黄毛片 | 久久一区二区三区99 | 亚洲精品亚洲人成在线麻豆 | 国产男女乱淫真视频全程播放 | 日本妞xxxxxxxxx69 | 久久精品国产线看观看亚洲 | 日本三级韩国三级在线观看a级 | www.亚洲国产 | a中文字幕1区 | 99re热视频这里只精品 | 日本欧美中文 | 精品国产v无码大片在线观看 | 韩国美女一级片 | 国产黄色在线网站 | 久久久久久免费观看 | 中文字幕一二三区 | 亚洲精品欧美精品中文字幕 | 亚洲精品字幕一区二区三区 | 国产精品国产欧美综合一区 | 一级女性全黄生活片免费 | 九九99久麻豆精品视传媒 | 国产亚洲自在精品久久 | 手机看片1024国产基地 | 黄色片三级网站 | 91精品国产欧美一区二区 | 欧美乱大交xxxxx | 国产不卡视频在线观看 | 国产免费人成在线看视频 | 成人影院vs一区二区 | 亚洲欧美专区精品久久 | 久久精品国产免费高清 | 免费欧美一级片 | 国产主播福利精品一区二区 | 久久三级网站 | 美女一丝不佳一级毛片香蕉 | 亚洲国产精品一区二区首页 | 在线成人天天鲁夜啪视频 |