zoukankan      html  css  js  c++  java
  • 参考Shiro的自定义基于Spring的AOP横切模式

    概要

    创建一个切入点PointcutAdvisor继承Spring的StaticMethodMatcherPointcutAdvisor

    创建一个MethodInterceptor方法拦截器org.aopalliance.intercept.MethodInvocation

    setAdvice(MethodInvocation mi)设置通知时传入一个MethodInterceptor方法拦截器

    调用Demo

    package com.wjz.demo;
    
    import org.springframework.aop.framework.ProxyFactory;
    
    import com.wjz.spring.CustomPointcutAdvisor;
    
    public class AopDemo {
    
        public static void main(String[] args) {
            ProxyFactory proxyFactory = new ProxyFactory();
            proxyFactory.addAdvisors(new CustomPointcutAdvisor());
            proxyFactory.setTarget(new Foo());
            Foo fooProxy = (Foo) proxyFactory.getProxy();
            fooProxy.foo("wjz");
        }
    }

    PointcutAdvisor切入点

    package com.wjz.spring;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
    
    /**
     * 自定义方法切入点
     * @author wjz
     *
     */
    @SuppressWarnings("serial")
    public class CustomPointcutAdvisor extends StaticMethodMatcherPointcutAdvisor {
    
        public CustomPointcutAdvisor() {
            setAdvice(new CustomMethodInterceptor());
        }
        
        @Override
        public boolean matches(Method method, Class<?> targetClass) {
            if ("foo".equals(method.getName())) {
                return true;
            }
            return false;
        }
    
    }

    MethodInterceptor方法拦截器

    package com.wjz.spring;
    
    import java.lang.reflect.Method;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    /**
     * 自定义方法拦截器
     * @author wjz
     *
     */
    public class CustomMethodInterceptor implements MethodInterceptor {
    
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("invoke method before");
            
            Object arg = invocation.getArguments()[0];
            System.out.println("arg " + arg);
            
            Object ti = invocation.getThis();
            System.out.println("this " + ti);
            
            Method method = invocation.getMethod();
            System.out.println("method " + method);
            
            System.out.println("toString " + toString());
            
            Object result = invocation.proceed();
            System.out.println("invoke method after");
            return result;
        }
    
    }
  • 相关阅读:
    [转载]程序员的激情其实是一种痛苦
    利用openSSL 生成RSA公钥和密钥
    表单调试工具推荐
    应该怎么做一个登录功能?
    [转载]常用 SQL Server 规范集锦
    Mock session,cookie,querystring in ASB.NET MVC
    解决VS2013 git客户端遇到的一些问题
    Expression<Func<T>>和Func<T>
    我所理解的领域驱动设计
    月经贴:当落魄的.NET基佬遇上不可一世的JAVA派 developer
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9065798.html
Copyright © 2011-2022 走看看