這篇文章給大家介紹使用Spring AOP時(shí)出現(xiàn)@Autowired依賴無(wú)法注入如何解決,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)專業(yè)提供IDC機(jī)房托管服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購(gòu)買IDC機(jī)房托管服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。發(fā)現(xiàn)問(wèn)題:
之前用springAOP做了個(gè)操作日志記錄,這次在往其他類上使用的時(shí)候,service一直注入失敗,找了網(wǎng)上好多內(nèi)容,發(fā)現(xiàn)大家都有類似的情況出現(xiàn),但是又和自己的情況不太符合。后來(lái)總結(jié)自己的情況發(fā)現(xiàn):方法為private修飾的,在AOP適配的時(shí)候會(huì)導(dǎo)致service注入失敗,并且同一個(gè)service在其他的public方法中就沒(méi)有這種情況,十分詭異。
解決過(guò)程:
結(jié)合查閱的資料進(jìn)行了分析:在org.springframework.aop.support.AopUtils中:
public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) { if (!pc.getClassFilter().matches(targetClass)) { return false; } MethodMatcher methodMatcher = pc.getMethodMatcher(); IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null; if (methodMatcher instanceof IntroductionAwareMethodMatcher) { introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher; } Set classes = new HashSet(ClassUtils.getAllInterfacesForClassAsSet(targetClass)); classes.add(targetClass); for (Iterator it = classes.iterator(); it.hasNext();) { Class clazz = (Class) it.next(); Method[] methods = clazz.getMethods(); for (int j = 0; j < methods.length; j++) { if ((introductionAwareMethodMatcher != null && introductionAwareMethodMatcher.matches(methods[j], targetClass, hasIntroductions)) || methodMatcher.matches(methods[j], targetClass)) { return true; } } } return false; }
此處Method[] methods = clazz.getMethods();
只能拿到public方法。
execution(* *(..))
可以匹配public/protected的,因?yàn)閜ublic的有匹配的了,目標(biāo)類就代理了,,,再進(jìn)行切入點(diǎn)匹配時(shí)也是能匹配的,而且cglib方式能拿到包級(jí)別/protected方法,而且包級(jí)別/protected方法可以直接通過(guò)反射調(diào)用。
private 修飾符的切入點(diǎn) 無(wú)法匹配 Method[] methods = clazz.getMethods();
這里的任何一個(gè),因此無(wú)法代理的。 所以可能因?yàn)閜rivate方法無(wú)法被代理,導(dǎo)致@Autowired不能被注入。
修正辦法:
1、將方法修飾符改為public;
2、使用AspectJ來(lái)進(jìn)行注入。
關(guān)于使用Spring AOP時(shí)出現(xiàn)@Autowired依賴無(wú)法注入如何解決就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。