切面编程--使用JDK动态代理

切面编程--使用JDK动态代理

1.使用JDK动态代理

对于直接使用JDK的动态代理的类的缺点:
1.对于实现代理的类,必须要实现接口,否则没有办法实现代理
2.写起来太难
接口:

package com.proxy.jdk;

public interface Calculater {
    public double add(double x, double y);

    public double cut(double x, double y);
}

接口的实现类:

package com.proxy.jdk;

public class MyCalculater implements Calculater {
    @Override
    public double add(double x, double y) {
        return x + y;
    }

    @Override
    public double cut(double x, double y) {
        return x - y;
    }
}

实现类的代理类:

package com.proxy.jdk;

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

public class MycalProxy {

    public static Calculater getMyCalProxy(final Calculater calculater) {
        ClassLoader loader = calculater.getClass().getClassLoader();
        Class<?>[] interfaces = calculater.getClass().getInterfaces();
        InvocationHandler h = new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象,任何时候都不要动这个对象
             * @param method 当前要执行的目标对象的方法
             * @param args 要传入的参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //利用反射执行目标方法
                //目标方法执行后的返回值
                System.out.println("方法执行之前我执行的操作。。。");
                Object result=method.invoke(calculater,args);
                System.out.println("方法执行之后我执行的操作。。。"+result);
                return result;
            }
        };
        Object object = Proxy.newProxyInstance(loader, interfaces, h);
        return (Calculater) object;
    }
}


测试类:

package com.proxy.jdk;

public class Test {
    public static void main(String[] args) {
        Calculater calculater = new MyCalculater();

        Calculater mycalProxy = MycalProxy.getMyCalProxy(calculater);

        System.out.println(mycalProxy.add(1, 8));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中,可以使用 JDK 动态代理来实现 AOP(面向切面编程)。下面是 JDK 动态代理使用步骤: 1. 定义一个接口(被代理类和代理类都要实现该接口): ```java public interface UserService { void addUser(String name); } ``` 2. 实现该接口的被代理类: ```java public class UserServiceImpl implements UserService { @Override public void addUser(String name) { System.out.println("Add user: " + name); } } ``` 3. 定义一个切面类,在该类中实现需要增加的方法: ```java public class LogAspect { public void before() { System.out.println("Method start..."); } public void after() { System.out.println("Method end..."); } } ``` 4. 在 Spring Boot 配置文件中配置需要注入的对象: ```java @Configuration public class AppConfig { @Bean public UserService userService() { return new UserServiceImpl(); } @Bean public LogAspect logAspect() { return new LogAspect(); } } ``` 5. 在代理类中实现 InvocationHandler 接口,并在其中实现需要增加的方法: ```java public class UserServiceProxy implements InvocationHandler { private Object target; private Object aspect; public UserServiceProxy(Object target, Object aspect) { this.target = target; this.aspect = aspect; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Method beforeMethod = aspect.getClass().getMethod("before"); beforeMethod.invoke(aspect); Object result = method.invoke(target, args); Method afterMethod = aspect.getClass().getMethod("after"); afterMethod.invoke(aspect); return result; } } ``` 6. 在业务逻辑中使用代理类: ```java @Service public class UserServiceImpl implements UserService { @Autowired private LogAspect logAspect; @Override public void addUser(String name) { UserService userService = new UserServiceImpl(); UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new UserServiceProxy(userService, logAspect)); proxy.addUser(name); } } ``` 以上就是使用 JDK 动态代理实现 AOP 的步骤,通过代理类实现了在被代理类的方法前后增加额外的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值