美文网首页
spring代理-面向切面、动态代理

spring代理-面向切面、动态代理

作者: 留存的情缘 | 来源:发表于2019-01-02 17:12 被阅读0次

    1、在JDKDynamicObject(代理类,代理其他类的动作)中传入Object的被代理类,这样泛化被代理类,后面可以传入多种继承相同接口的类,实现动态的代理

    2、在JDKDynamicObject(代理类,代理其他类的动作)中可以代理执行被代理类中的方法

    3、(1)定义一个注解PersonAnnotation,(2)用这个PersonAnnotation设置切面PersonAspect,在切面里设置切入点@Pointcut("@annotation(com.chinamobile.cmss.service.aop.PersonAnnotation)")。在切点前@Before("pointCut()")后@After("pointCut()")可以做一些操作。

    (3)在执行的方法上@PersonAnnotation(name="Chinese")会解析出需要调用切面的相关信息


    参https://www.cnblogs.com/onlymate/p/9630788.html,自己留个笔记

    public interface Person {

    String say(String name);

    void eat(String food);

    }


    public @interface PersonAnnotation {

    String name();

    }


    @Aspect

    @Component

    public class PersonAspect {

    private Loggerlogger = LoggerFactory.getLogger(PersonAspect.class);

        @Pointcut("@annotation(com.chinamobile.cmss.service.aop.PersonAnnotation)")

    public void pointCut(){

    }

    @Before("pointCut()")

    public void before(JoinPoint joinPoint) {

    logger.info("PersonAspect ==> before method : {}", joinPoint.getClass());

        }

    @After("pointCut()")

    public void after(JoinPoint joinPoint){

    logger.info("PersonAspect ==> after method : {}", joinPoint.getClass());

        }

    }


    @Component

    public class Chinese implements Person {

    private Loggerlogger = LoggerFactory.getLogger(Person.class);

        public Chinese() {

    super();

            logger.info("Chinese ==> Chinese method : 正在生成一个Chinese实例");

        }

    @Override

        @PersonAnnotation(name="Chinese")//该注解是用来定义切点

        public Stringsay(String name) {

    logger.info("Chinese ==> say method : say {}", name);

            return name +" hello, JDK implement AOP";

        }

    @Override

        public void eat(String food) {

    logger.info("Chinese ==> eat method : eat {}", food);

        }

    }


    @Component

    public class American {

    private Logger logger = LoggerFactory.getLogger(American.class);

        public American() {

    super();

            logger.info("American ==> American method : 正在生成一个American实例");

        }

    @PersonAnnotation(name="American")//该注解是用来定义切点

        public String say(String name) {

    logger.info("American ==> say method : say {}", name);

            return name +" hello, CGLIB implement AOP";

        }

    public void eat(String food) {

    logger.info("American ==> eat method : eat {}", food);

        }

    }


    public class JDKDynamicObject implements InvocationHandler {

    private Loggerlogger = LoggerFactory.getLogger(JDKDynamicObject.class);

        private Objecttarget;

        public JDKDynamicObject() {

    }

    /**

        * @Description: 绑定对象,并生成代理对象

        * @Title: bind

        * @author OnlyMate

        * @Date 2018年9月11日 下午4:48:31

        * @param target

        * @return

        */

        public Objectbind(Object target) {

    this.target = target;

            // 取得代理对象

            return Proxy.newProxyInstance(target.getClass().getClassLoader(),

                    target.getClass().getInterfaces(), this);

        }

    @Override

        public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {

    logger.info("JDKDynamicObject ==> invoke method : {},{},{}", proxy.getClass(), method.getName(),

                    args.toString());

            method.invoke(target, args);

    return null;

        }

    }


    public class CGLIBDynamicObject implements InvocationHandler {

    private Loggerlogger = LoggerFactory.getLogger(CGLIBDynamicObject.class);

        private Objecttarget;

        public CGLIBDynamicObject() {

    }

    /**

        * @Description: 绑定对象,并生成代理对象

        * @Title: bind

        * @author OnlyMate

        * @Date 2018年9月11日 下午4:48:31

        * @param target

        * @return

        */

        public Objectbind(Object target) {

    this.target = target;

            Enhancer enhancer =new Enhancer();

            enhancer.setSuperclass(this.target.getClass());

            // 回调方法

            enhancer.setCallback(this);

            // 创建代理对象

            return enhancer.create();

        }

    @Override

        public Objectinvoke(Object arg0, Method arg1, Object[] arg2)throws Throwable {

    logger.info("CGLIBDynamicObject ==> invoke method : {},{},{}", arg0.getClass(), arg1.getName(),

                    arg2.toString());

            arg1.invoke(target, arg2);

    return null;

        }

    }

    相关文章

      网友评论

          本文标题:spring代理-面向切面、动态代理

          本文链接:https://www.haomeiwen.com/subject/bgovtxtx.html