栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面向切面编程(动态代理)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面向切面编程(动态代理)

  1. 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  2. AOP编程操作的主要对象是切面(aspect),而切面用于模块化横切关注点(公共功能)。

 使用JDK动态代理实现日志的打印

package com.longli.spring.aop.beans;

public interface Calculator {
    int add(int a,int b);
    int sub(int a,int b);
    int mul(int a,int b);
    int div(int a,int b);
}
package com.longli.spring.aop.beans;

import org.springframework.stereotype.Component;

public class CalculatorImpl implements Calculator {
    @Override
    public int add(int a, int b) {
        int result =a+b;
        return result;
    }

    @Override
    public int sub(int a, int b) {
        int result =a-b;
        return result;
    }

    @Override
    public int mul(int a, int b) {
        int result =a*b;
        return result;
    }

    @Override
    public int div(int a, int b) {
        int result =a/b;
        return result;
    }
}
package com.longli.spring.log;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class LoggingProxy {
    //被代理对象
    private Object target;

    public LoggingProxy(Object target) {
        this.target = target;
    }

    public Object getProxy(){
        //获取被代理对象的加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //实现被代理对象的接口们
        Class[] interfaces = target.getClass().getInterfaces();
        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //获取方法名
                String methodName = method.getName();
                
                System.out.println("logging:The method "+methodName+" begin with"+ Arrays.toString(args));
                //执行目标,即将方法的调用转到代理对象上
                Object result = method.invoke(target, args);
                System.out.println("Logging:The method "+methodName+" return "+result);
                return result;
            }
        });
        return proxy;
    }
}
    @Test
    public void testLoggingProxy(){
        Calculator calculator=new CalculatorImpl();
        //获取代理对象
        Calculator calculator1 = (Calculator) new LoggingProxy(calculator).getProxy();
        int add = calculator1.add(10, 2);
        System.out.println(add);
        int sub = calculator1.sub(10, 2);
        System.out.println(sub);
        int mul = calculator1.mul(10, 2);
        System.out.println(mul);
        int div = calculator1.div(10, 2);
        System.out.println(div);
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号