zoukankan      html  css  js  c++  java
  • spring 注解aop调用invoke()

    public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:config" + "/spring/applicationContext-core2.xml");
            MyService as = (MyService) context.getBean("annotationServiceImpl");
            as.doSomething("Jack");  //aop起作用,com.zhuguang.jack.annotation.AnnotationServiceImpl@1c55f277,里面的h = org.springframework.aop.framework.JdkDynamicAopProxy@50c6911c,h里面的advised = ProxyFactory = 1 interfaces [MyService]; 4 advisors [ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr(JoinPoint)]; InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd(ProceedingJoinPoint) ];  InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee(JoinPoint)]; ]; targetSource [AnnotationServiceImpl@1c55f277]]; 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            TargetSource targetSource = this.advised.targetSource;    //AnnotationServiceImpl,被代理的类,
            Class<?> targetClass = null;
            Object target = null;
            try {
                if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) {   //调用的方法是equals方法,就直接调用了,不用代理了。
                    return equals(args[0]);
                }
                if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) { //调用的方法是hashCode方法,就直接调用了,不用代理了。
                    return hashCode();
                }
                if (!this.advised.opaque && method.getDeclaringClass().isInterface() &&
                        method.getDeclaringClass().isAssignableFrom(Advised.class)) {//调用的方法是,,就直接调用了,不用代理了。
                    return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
                }
                Object retVal;
                target = targetSource.getTarget();
                if (target != null) {
                    targetClass = target.getClass();//class com.zhuguang.jack.annotation.AnnotationServiceImpl
                }
                List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);   //advised = ProxyFactory代理工厂,
    [public void arounddd(ProceedingJoinPoint) , public void beforeee(JoinPoint), public void afterrr(JoinPoint), public void pc1()]这些切面已经加到工厂里面去了, [ExposeInvocationInterceptor@65aa6596,
    AspectJAfterAdvice: advice method [public void afterrr()]; aspect name 'aspectAnnotation', 
    AspectJAroundAdvice: advice method [public void arounddd() ]; aspect name 'aspectAnnotation', 
    MethodBeforeAdviceInterceptor@1ce61929]
                else {
                    invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
                    retVal = invocation.proceed();   //调用,invocation = ReflectiveMethodInvocation,
                }
                Class<?> returnType = method.getReturnType();   //返回值
                return retVal;
            }
        }
    public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, Class<?> targetClass) {
            MethodCacheKey cacheKey = new MethodCacheKey(method);   //doSomething方法,
            List<Object> cached = this.methodCache.get(cacheKey);
            if (cached == null) {
                cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(this, method, targetClass);
                this.methodCache.put(cacheKey, cached);
            }
            return cached;
        }
    public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
                Advised config, Method method, Class<?> targetClass) {  //config = ProxyFactory,method = doSomething(),targetClass = AnnotationServiceImpl
    
            List<Object> interceptorList = new ArrayList<Object>(config.getAdvisors().length);
            boolean hasIntroductions = hasMatchingIntroductions(config, targetClass);
            AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
            for (Advisor advisor : config.getAdvisors()) {//[ExposeInvocationInterceptor.ADVISOR, 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr()]; 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd() ]; 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee()]]
                if (advisor instanceof PointcutAdvisor) {
                    PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;  //AspectAnnotation.afterrr,AspectAnnotation.arounddd,AspectAnnotation.beforeee,
                    if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) {   //在不在Pointcut的表达式里面,匹配的是类。
                        MethodInterceptor[] interceptors = registry.getInterceptors(advisor);  //AspectAnnotation.afterrr,
                        MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();  //AspectJExpressionPointcut: () pc1(),
                        if (MethodMatchers.matches(mm, method, targetClass, hasIntroductions)) {  //前面匹配的是类,这里匹配的是方法。
                            else {
                                interceptorList.addAll(Arrays.asList(interceptors));
                            }
                        }
                    }
                }
            }
            return interceptorList;
        }
    public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException {
            List<MethodInterceptor> interceptors = new ArrayList<MethodInterceptor>(3);
            Advice advice = advisor.getAdvice();
            if (advice instanceof MethodInterceptor) {
                interceptors.add((MethodInterceptor) advice);
            }
            for (AdvisorAdapter adapter : this.adapters) {
                if (adapter.supportsAdvice(advice)) {
                    interceptors.add(adapter.getInterceptor(advisor));
                }
            }
            return interceptors.toArray(new MethodInterceptor[interceptors.size()]);
        }
    public Object proceed() throws Throwable { 
            if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {   //索引是最后一个就调用被代理类的方法,interceptorsAndDynamicMethodMatchers  =  [ExposeInvocationInterceptor.ADVISOR, 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr()]; 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd() ]; 
    InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee()]]
                return invokeJoinpoint();    //被代理类的方法
            }
    
            Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);  //根据索引拿到第一个,第二个,。。
    
            else { 
                return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);   //链是调用,this = invocation = ReflectiveMethodInvocation,
            }
        }
    ExposeInvocationInterceptor类的invoke()方法
    public Object invoke(MethodInvocation mi) throws Throwable {
            MethodInvocation oldInvocation = invocation.get();
            invocation.set(mi);
            try {
                return mi.proceed();   //mi = invocation = ReflectiveMethodInvocation,又调会去了,拿到第二个。
            }
            finally {
                invocation.set(oldInvocation);
            }
        }
    AspectAnnotation.afterrr(org.aspectj.lang.JoinPoint) 类:
    public Object invoke(MethodInvocation mi) throws Throwable {
            try {
                return mi.proceed();   //mi = invocation = ReflectiveMethodInvocation,又调会去了,拿到第三个。after所以现在不会执行。
            }
            finally {
                invokeAdviceMethod(getJoinPointMatch(), null, null);
            }
        }
    AspectAnnotation.arounddd(org.aspectj.lang.ProceedingJoinPoint)类
    public Object invoke(MethodInvocation mi) throws Throwable {
            ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;//mi = invocation = ReflectiveMethodInvocation,
            ProceedingJoinPoint pjp = lazyGetProceedingJoinPoint(pmi);
            JoinPointMatch jpm = getJoinPointMatch(pmi);
            return invokeAdviceMethod(pjp, jpm, null, null);
        }
    protected Object invokeAdviceMethod(JoinPoint jp, JoinPointMatch jpMatch, Object returnValue, Throwable t)
                throws Throwable {
            return invokeAdviceMethodWithGivenArgs(argBinding(jp, jpMatch, returnValue, t));
        }
    
    protected Object invokeAdviceMethodWithGivenArgs(Object[] args) throws Throwable {
            try {
                ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);
                return this.aspectJAdviceMethod.invoke(this.aspectInstanceFactory.getAspectInstance(), actualArgs);
            }
    public Object invoke(Object obj, Object... args)
        {
            MethodAccessor ma = methodAccessor;             // read volatile
            if (ma == null) {
                ma = acquireMethodAccessor();
            }
            return ma.invoke(obj, args);
        }
    调到了
    public void arounddd(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("==============arounddd  前置通知=========");
            joinPoint.proceed();  //MethodBeforeAdviceInterceptor去执行,
            System.out.println("==============arounddd  后置通知=========");
        }
    public Object invoke(MethodInvocation mi) throws Throwable {
            this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );//beforeee()方法执行,
            return mi.proceed();   //  被代理类的方法执行,
        }
     public void beforeee(JoinPoint joinPoint) {
            System.out.println("==============beforeee 前置通知=========");
        }
    public String doSomething(String param) {
            System.out.println("==========AnnotationServiceImpl.doSomething=========");
            return "==========AnnotationServiceImpl.doSomething";
        }
    最后执行after:
    invokeAdviceMethod(getJoinPointMatch(), null, null);
    protected Object invokeAdviceMethodWithGivenArgs(Object[] args) throws Throwable {
            try {
                ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);
                return this.aspectJAdviceMethod.invoke(this.aspectInstanceFactory.getAspectInstance(), actualArgs);
            }
        }
    
    public Object invoke(Object obj, Object... args)
        {
            MethodAccessor ma = methodAccessor;             // read volatile
            if (ma == null) {
                ma = acquireMethodAccessor();
            }
            return ma.invoke(obj, args);
        }
    
    public void afterrr(JoinPoint joinPoint) {
            System.out.println("==============afterrr 后置通知=========");
        }
    ==============arounddd  前置通知=========
    ==============beforeee 前置通知=========
    ==========AnnotationServiceImpl.doSomething=========
    ==============arounddd  后置通知=========
    ==============afterrr 后置通知=========
    cglib的代理
    return proxyFactory.getProxy(this.proxyClassLoader);
    public Object getProxy(ClassLoader classLoader) {
            try {
                Class<?> rootClass = this.advised.getTargetClass();   //advised = ProxyFactory 
    
                Class<?> proxySuperClass = rootClass;  //AnnotationServiceImpl
    
                Callback[] callbacks = getCallbacks(rootClass);//[CglibAopProxy$DynamicAdvisedInterceptor@2ce86164, 
    CglibAopProxy$StaticUnadvisedInterceptor@5e8f9e2d, 
    CglibAopProxy$SerializableNoOp@51df223b, 
    CglibAopProxy$StaticDispatcher@fd46303, 
    CglibAopProxy$AdvisedDispatcher@60d8c0dc, 
    CglibAopProxy$EqualsInterceptor@4204541c, 
    CglibAopProxy$HashCodeInterceptor@6a62689d]
                Class<?>[] types = new Class<?>[callbacks.length];
                for (int x = 0; x < types.length; x++) {
                    types[x] = callbacks[x].getClass();
                } 
                enhancer.setCallbackFilter(new ProxyCallbackFilter(
                        this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
                enhancer.setCallbackTypes(types); 
                return createProxyClassAndInstance(enhancer, callbacks);
            }
        }
    调用方法时候:
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                try {
                    List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);    //
    [ExposeInvocationInterceptor@65aa6596,
    AspectJAfterAdvice: advice method [public void afterrr()]; aspect name 'aspectAnnotation', 
    AspectJAroundAdvice: advice method [public void arounddd() ]; aspect name 'aspectAnnotation', 
    MethodBeforeAdviceInterceptor@1ce61929]
                    Object retVal; 
                    if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) { 
                        retVal = methodProxy.invoke(target, args);
                    }
                    else {
                        // We need to create a method invocation...
                        retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
                    }
                    retVal = processReturnType(proxy, target, method, retVal);
                    return retVal;
                } 
            }
    public Object proceed() throws Throwable { 
            if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
                return invokeJoinpoint();
            }
    
            Object interceptorOrInterceptionAdvice =
                    this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); 
            else { 
                return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
            }
        }
  • 相关阅读:
    SqlParameter构造函数让人大吃一斤
    ASP.NET的图片上传和显示
    不去琢磨什么CSS后代选择器之类的鸟玩意了
    datatable里添加一个标识列
    提高工作效率
    调试无法命中断点问题
    离DBA还有多远?
    开发守则
    方法或函数也可以用泛型
    母版页访问内容页
  • 原文地址:https://www.cnblogs.com/yaowen/p/11776851.html
Copyright © 2011-2022 走看看