Spring源码学习笔记(三)AOP实现
2016-06-07 15:50
836 查看
Spring-AOP入口
这一段代码,是实现AOP的具体入口,发现不是bean标签则会使用不同的类进行解析,
AopNamespaceHandler.java
AspectJAutoProxyBeanDefinitionParser.java
AopNamespaceUtils.java
AopConfiugUtils.java
到此自动代理创建器注册完成。
自动代理创建器如何工作?
AnnotationAwareAspectJAutoProxy的接口、父类如上图,其中BeanPostProcessor是实现代理的,AOP逻辑分析也是由BeanPostProcessor中PostprocessAfterInitialization开始。
BeanPostProcessor.java
AbstractAutoProxyCreator.java
CglibAopProxy.java
JdkDynamicAopProxy.java
<aop:aspectj-autoproxy />
这一段代码,是实现AOP的具体入口,发现不是bean标签则会使用不同的类进行解析,
http\://www.springframework.org/schema/aop=org.springframeworl.aop.config.AopNamespaceHandler在XML的头部可以看到这样的配置,标志着 AOP的解析 使用AopNamespaceHandler类来解析。
AopNamespaceHandler.java
public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); //对aspectj-autoproxy解析注册,下面看 AspectJAutoProxyBeanDefinitionParser类 registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator()); // Only in 2.0 XSD: moved to context namespace as of 2.1 registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser()); }
AspectJAutoProxyBeanDefinitionParser.java
public BeanDefinition parse(Element element, ParserContext parserContext) { //注册AnnotationAwareAspectJAutoProxyCreator AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element); // 对于注释中子类进行处理 extendBeanDefinition(element, parserContext); return null; }
AopNamespaceUtils.java
public static void registerAspectJAutoProxyCreatorIfNecessary( ParserContext parserContext, Element sourceElement) { //注册AutoProxyCreator beanName :org.Springframework.aop.config.internalAutoProxyCreator BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAutoProxyCreatorIfNecessary( parserContext.getRegistry(), parserContext.extractSource(sourceElement)); //对于proxy-target-class expose-proxy解析处理 useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement); // 注册组件并通知,便于监听器作进一步处理 // 其中 beanDefinition 的 className 为 AnnotationAwareAspectJAutoProxyCreator registerComponentIfNecessary(beanDefinition, parserContext); }
AopConfiugUtils.java
private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); //判断是否存在自动创建代理器,若存在,则判断优先级,谁优先级高用谁 if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) { BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME); if (!cls.getName().equals(apcDefinition.getBeanClassName())) { //已注册的Bean当前优先级 int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName()); //传入的Bean优先级 int requiredPriority = findPriorityForClass(cls); if (currentPriority < requiredPriority) { //替换 apcDefinition.setBeanClassName(cls.getName()); } } return null; } RootBeanDefinition beanDefinition = new RootBeanDefinition(cls); beanDefinition.setSource(source); beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); //注册创建器 registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition); return beanDefinition; }
到此自动代理创建器注册完成。
自动代理创建器如何工作?
AnnotationAwareAspectJAutoProxy的接口、父类如上图,其中BeanPostProcessor是实现代理的,AOP逻辑分析也是由BeanPostProcessor中PostprocessAfterInitialization开始。
BeanPostProcessor.java
//应用此前置处理器给新的bean实例 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; //应用此后置处理器给新的bean实例 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
AbstractAutoProxyCreator.java
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean != null) { //获取一个key 格式:classname_beanname Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { // 如果它适合被代理,则需要封装指定 bean。 return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; } //获取key protected Object getCacheKey(Class<?> beanClass, String beanName) { return beanClass.getName() + "_" + beanName; } //代理生成Bean protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { //判断缓存 if (beanName != null && this.targetSourcedBeans.contains(beanName)) { return bean; } //判断是否需要增强 if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) { return bean; } if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; } // 若存在增强,则创建代理,(下一张详细解析如何获取增强) 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; } this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; } //生成代理 protected Object createProxy( Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { //代理工厂 ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); //判断使用 JDK动态代理 OR CGLIB if (!proxyFactory.isProxyTargetClass()) { if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass(true); } else { evaluateProxyInterfaces(beanClass, proxyFactory); } } //装配代理工厂 参数 Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); for (Advisor advisor : advisors) { proxyFactory.addAdvisor(advisor); } proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); } //生成代理 首先根据目标类的属性,选择 JDK动态代理 或者 CGLIB动态代理,再通过参数进行代理生成 return proxyFactory.getProxy(getProxyClassLoader()); } @Override //代理实现核心逻辑 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MethodInvocation invocation; Object oldProxy = null; boolean setProxyContext = false; TargetSource targetSource = this.advised.targetSource; Class<?> targetClass = null; Object target = null; try { if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) { // The target does not implement the equals(Object) method itself. return equals(args[0]); } if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) { // The target does not implement the hashCode() method itself. return hashCode(); } if (!this.advised.opaque && method.getDeclaringClass().isInterface() && method.getDeclaringClass().isAssignableFrom(Advised.class)) { // Service invocations on ProxyConfig with the proxy config... return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args); } Object retVal; if (this.advised.exposeProxy) { // Make invocation available if necessary. oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } // May be null. Get as late as possible to minimize the time we "own" the target, // in case it comes from a pool. target = targetSource.getTarget( b8ff ); if (target != null) { targetClass = target.getClass(); } // Get the interception chain for this method. List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); // Check whether we have any advice. If we don't, we can fallback on direct // reflective invocation of the target, and avoid creating a MethodInvocation. if (chain.isEmpty()) { // We can skip creating a MethodInvocation: just invoke the target directly // Note that the final invoker must be an InvokerInterceptor so we know it does // nothing but a reflective operation on the target, and no hot swapping or fancy proxying. retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args); } else { // We need to create a method invocation... invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain); // Proceed to the joinpoint through the interceptor chain. retVal = invocation.proceed(); } // Massage return value if necessary. Class<?> returnType = method.getReturnType(); if (retVal != null && retVal == target && returnType.isInstance(proxy) && !RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())) { // Special case: it returned "this" and the return type of the method // is type-compatible. Note that we can't help if the target sets // a reference to itself in another returned object. retVal = proxy; } else if (retVal == null && returnType != Void.TYPE && returnType.isPrimitive()) { throw new AopInvocationException( "Null return value from advice does not match primitive return type for: " + method); } return retVal; } finally { if (target != null && !targetSource.isStatic()) { // Must have come from TargetSource. targetSource.releaseTarget(target); } if (setProxyContext) { // Restore old proxy. AopContext.setCurrentProxy(oldProxy); } } }
CglibAopProxy.java
//Cglib获取代理 (先了解下CGLIB工作原理,以及实现方式) public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { logger.debug("Creating CGLIB proxy: target source is " + this.advised.getTargetSource()); } try { Class<?> rootClass = this.advised.getTargetClass(); Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy"); Class<?> proxySuperClass = rootClass; //判断是否是CGLIB生成的类 if (ClassUtils.isCglibProxyClass(rootClass)) { proxySuperClass = rootClass.getSuperclass(); Class<?>[] additionalInterfaces = rootClass.getInterfaces(); for (Class<?> additionalInterface : additionalInterfaces) { this.advised.addInterface(additionalInterface); } } // 验证类是否可以使用Cglib(Final修饰的不允许继承) validateClassIfNecessary(proxySuperClass, classLoader); // CGLIB 关键 Enhancer enhancer = createEnhancer(); if (classLoader != null) { enhancer.setClassLoader(classLoader); if (classLoader instanceof SmartClassLoader && ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) { enhancer.setUseCache(false); } } enhancer.setSuperclass(proxySuperClass); enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); enhancer.setStrategy(new UndeclaredThrowableStrategy(UndeclaredThrowableException.class)); Callback[] callbacks = getCallbacks(rootClass); Class<?>[] types = new Class<?>[callbacks.length]; for (int x = 0; x < types.length; x++) { types[x] = callbacks[x].getClass(); } // fixedInterceptorMap only populated at this point, after getCallbacks call above enhancer.setCallbackFilter(new ProxyCallbackFilter( this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset)); enhancer.setCallbackTypes(types); // 创建代理 return createProxyClassAndInstance(enhancer, callbacks); } catch (CodeGenerationException ex) { throw new AopConfigException("Could not generate CGLIB subclass of class [" + this.advised.getTargetClass() + "]: " + "Common causes of this problem include using a final class or a non-visible class", ex); } catch (IllegalArgumentException ex) { throw new AopConfigException("Could not generate CGLIB subclass of class [" + this.advised.getTargetClass() + "]: " + "Common causes of this problem include using a final class or a non-visible class", ex); } catch (Exception ex) { // TargetSource.getTarget() failed throw new AopConfigException("Unexpected AOP exception", ex); } }
JdkDynamicAopProxy.java
//JDK动态代理生成 public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource()); } Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised); findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); } private void findDefinedEqualsAndHashCodeMethods(Class<?>[] proxiedInterfaces) { for (Class<?> proxiedInterface : proxiedInterfaces) { Method[] methods = proxiedInterface.getDeclaredMethods(); for (Method method : methods) { if (AopUtils.isEqualsMethod(method)) { this.equalsDefined = true; } if (AopUtils.isHashCodeMethod(method)) { this.hashCodeDefined = true; } if (this.equalsDefined && this.hashCodeDefined) { return; } } } }
相关文章推荐
- Java中权限控制区分
- springmvc配置日志
- java中null 关键字
- 单链表----java语言实现
- spring mvc 自定义转换器
- 大话程序猿眼里的高并发
- 0005_类与对象
- 深入java单例模式
- Eclipse中的引用项目报Could not find *.apk!解决办法
- Spring容器初始化过程
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderServlet服务器启动报异常
- spring,mybatis事务管理配置与@Transactional注解使用
- Java并发编程-同步辅助类之Exchanger
- eclipse的异常断点和条件断点
- 《深入分析JAVA web技术内幕》 之 CDN和Load balance
- springMVC 的两种文件上传方式
- 【官小飞】博主文章转载-文件上传和下载
- Java对于Cookie的操作详解
- SpringMVC Json字符串/Json字符串数组转对象/对象数组方法
- Springmvc返回JSON乱码问号