先说如果方法是public的,再研究细节@ServicepublicclassTestServiceImpl{@Transactional(rollbackFor=Exception.class)publicvoidtrans1(){}}AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(),其中applyBeanPostProcessorsAfterInitialization()继承自AbatorstractAutoProxy下是方法细节publicObjectapplyBeanPostProcessorsAfterInitialization(ObjectexistingBean,StringbeanName)throwsBeansException{Objectresult=existingBean;//getBeanPostProcessors()是sptringboot启动时系统配置的BeanPostProcessor;其中有一个BeanPostProcessor叫做AnnotationAwareAspectJAutoProxyCreator;for(BeanPostProcessorbeanProcessor:getBeanPostProcessors()){//WhentraversingAnnotationAwareAspectJAutoProxyCreator,executeitspostProcessAfterInitialization()Objectcurrent=beanProcessor.postProcessAfterInitialization(结果,豆名);if(current==null){返回结果;}结果=当前的;}返回结果;}以下是AbstractAutoProxyCreator.postProcessAfterInitialization()的详细信息:if(!this.earlyProxyReferences.contains(cacheKey)){//该方法的重要逻辑是根据beanName获取通知列表,如果列表不为空,则创建代理类;返回wrapIfNecessary(bean,beanName,cacheKey);}}返回豆;}图2图3protectedObjectwrapIfNecessary(Objectbean,StringbeanName,ObjectcacheKey){//获取bean和beanName获取通知列表。Object[]specificInterceptors=getAdvicesAndAdvisorsForBean(bean.getClass(),beanName,null);//本例中testServiceImpl的具体拦截器如图2所示;//如果通知列表不为空,创建代理类if(specificInterceptors!=DO_NOT_PROXY){this.advisedBeans.put(cacheKey,Boolean.TRUE);//执行具体的创建代理逻辑。本例中testServiceImpl的specificInterceptors如图3所示。this.proxyTypes.put(cacheKey,proxy.getClass());//直接returnreturnproxy;}//如果没有匹配的通知列表,返回一个普通beanthis.advisedBeans.put(cacheKey,Boolean.FALSE);returnbean;}如果我们在测试的情况下去掉public呢?,我们直接贴出结果:图4显示specificInterceptors=null,也就是说没有为其生成代理类。是什么原因?我们继续往下看://candidateAdvisors来自springboot启动配置通知列表try{//具体匹配逻辑由AopUtils.findAdvisorsThatCanApply()执行returnAopUtils.findAdvisorsThatCanApply(candidateAdvisors,beanClass);}最后{ProxyCreationContext.setCurrentProxiedBeanName(null);我们可以看到等待选择的通知列表有24个图5publicstaticbooleancanApply(Pointcutpc,Class>targetClass,booleanhasIntroductions){IntroductionAwareMethodMatcherintroductionAwareMethodMatcher=null;如果(methodMatcherinstanceofIntroductionAwareMethodMatcher){introductionAwareMethodMatcher=(IntroductionAwareMethodMatcher)methodMatcher;}Set
