• AOP:jdk的动态代理


    1.文件结构

    2.建立接口

    package com.wangcf.manager;
    
    
    public interface IUserManager {
        
        public void add();
        
        public void del();
        
        public void update();
        
        public String load(int uid);
    }

    3.实现接口,里面的所有方法都是切入点PointCut

    package com.wangcf.manager;
    
    
    public class UserManagerImp implements IUserManager{
        @Override
        public void add(){
            System.out.println("UserManagerImp add...");
        }
        @Override
        public void del(){
            System.out.println("UserManagerImp del...");
        }
        @Override
        public void update(){
            System.out.println("UserManagerImp update...");
        }
    
        @Override
        public String load(int uid) {
            // TODO Auto-generatuided method stub
            System.out.println("UserManagerImp load...");
            return "asda"+uid;
        }
    }

    4.切面拦截,切面类aspect

    package com.wangcf.manager;
    
    public class LogManager {
        //advice(通知)
        public static void addLog(){
            System.out.println("添加日志...");
        }
    }

    5.获取代理类

    package com.wangcf.handler;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import com.wangcf.manager.LogManager;
    
    public class MyInvocationHandler implements InvocationHandler{
    
        private Object target;//目标对象
        
        public MyInvocationHandler(Object target) {
            // TODO Auto-generated constructor stub
            this.target=target;
        }
        
        public Object newProxy(){
            Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), 
                    this);
            return proxy;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            // TODO Auto-generated method stub
            System.out.println("MyInvocationHandler invoke...");
            /*
             * 
             */
            LogManager.addLog();
            //去执行目标对象的方法
            System.out.println("args: "+args);
            //去执行目标对象的方法
            Object returnValue = method.invoke(target, args);
            System.out.println("returnValue:"+returnValue);
            return returnValue;
        }
    
    }

    6.测试类

    package com.wangcf.test;
    
    import com.wangcf.handler.MyInvocationHandler;
    import com.wangcf.manager.IUserManager;
    import com.wangcf.manager.UserManagerImp;
    
    public class TestAction {
        public static void main(String[] args) {
         //目标对象userManager IUserManager userManager
    =new UserManagerImp(); //下面这段获取代理 MyInvocationHandler mh=new MyInvocationHandler(userManager); Object proxy=mh.newProxy(); System.out.println(proxy.getClass().getName()); IUserManager userManagerProxy=(IUserManager)proxy; //不带参数add,和load方法称为连接点JoinPoint userManagerProxy.add(); System.out.println("=============="); //带参数 userManagerProxy.load(10); } }

    7.输出:

    8.总结:

    Proxy0是动态获取的代理

    通过连接点进入切面,LogManager为切面类

  • 相关阅读:
    Linux基础——硬盘分区、格式化及文件系统的管理
    Linux基础——系统监控
    Centos7安装并配置mysql5.6完美教程
    lr常用函数
    Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
    cmd批处理常用符号详解
    Java 和 JSP 实现网站访问量统计 (刷新过滤)
    JAVA 导出 Excel, 将Excel下载到本地
    JAVA 导出 Excel, JS 导出 Excel
    windows server服务器上部署java+tomcat网站域名配置
  • 原文地址:https://www.cnblogs.com/-beauTiFul/p/6322453.html
Copyright © 2020-2023  润新知