在创建对象doCreateBean方法里面,执行完依赖注入populateBean方法以后,在initializeBean方法中进行AOP增强:
try { populateBean(beanName, mbd, instanceWrapper); exposedObject = initializeBean(beanName, exposedObject, mbd); }
通过调用AbstractAutoProxyCreator的applyBeanPostProcessorsAfterInitialization方法
@Override public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { Object current = processor.postProcessAfterInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; }
@Override public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (this.earlyProxyReferences.remove(cacheKey) != bean) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
调用wrapIfNecessary方法返回代理对象
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); if (specificInterceptors != DO_NOT_PROXY) { this.advisedBeans.put(cacheKey, Boolean.TRUE); Object proxy = createProxy( bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; }
关键看Object[] specificInterceptors 这个东西是什么,查看getAdvicesAndAdvisorsForBean方法:
@Override @Nullable protected Object[] getAdvicesAndAdvisorsForBean( Class> beanClass, String beanName, @Nullable TargetSource targetSource) { List advisors = findEligibleAdvisors(beanClass, beanName); if (advisors.isEmpty()) { return DO_NOT_PROXY; } return advisors.toArray(); }
这里返回了一个Advisor的List:advisors ,可以理解为这些需要给对象增强的一个个通知
protected List findEligibleAdvisors(Class> beanClass, String beanName) { List candidateAdvisors = findCandidateAdvisors(); List eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); extendAdvisors(eligibleAdvisors); if (!eligibleAdvisors.isEmpty()) { eligibleAdvisors = sortAdvisors(eligibleAdvisors); } return eligibleAdvisors; }
findEligibleAdvisors包含有3个方法,第一个方法是寻找所有的切面的通知(如果是第一次,会解析配置类,将切面的通知都缓存起来,第二个方法是筛选出匹配这个对象的通知列表,第三个是advisors.add(0, ExposeInvocationInterceptor.ADVISOR)加上ExposeInvocationInterceptor拦截器。
specificInterceptors 就是可以理解为一个拦截器的列表,每个拦截器都封装了拦截后执行的方法,以及这个拦截器拦截的类型(before,after等等)
接下来就可以看创建代理类的方法了
Object proxy = createProxy( bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); protected Object createProxy(Class> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass); } ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); if (!proxyFactory.isProxyTargetClass()) { if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass(true); } else { evaluateProxyInterfaces(beanClass, proxyFactory); } } Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); proxyFactory.addAdvisors(advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); } return proxyFactory.getProxy(getProxyClassLoader()); }
可以看到proxyFactory持有了advisors,targetSource这些对象,然后调用getProxy的方法
public Object getProxy(@Nullable ClassLoader classLoader) { return createAopProxy().getProxy(classLoader); }
createAopProxy方法其实就是选择用jdk的动态代理还是cglib的动态代理:
@Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }
最终调用getProxy方法其实就是在调用JdkDynamicAopProxy或者ObjenesisCglibAopProxy的getProxy方法,先看jdk的动态代理方法
@Override public Object getProxy(@Nullable ClassLoader classLoader) { if (logger.isTraceEnabled()) { logger.trace("Creating JDK dynamic proxy: " + this.advised.getTargetSource()); } Class>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true); findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); }
根据jdk动态代理的方法,当调用接口的方法时,其实会走到动态代理h对象的invoke方法里面去,可以看一下JdkDynamicAopProxy的invoke方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Get the interception chain for this method. List
里面的关键代码就这几行:
如果拦截链返回为空,就直接执行这个方法。否则会生产一个invocation对象,利用责任链模式一个一个调用拦截器的方法,对方法进行增强。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)