Java的三种代理模式

在这里插入图片描述
静态代理 动态代理区别 不需要写java文件,自动生成
在这里插入图片描述

1.静态代理
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:

因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
2.动态代理
JDK中生成代理对象的API
代理类所在包:java.lang.reflect.Proxy

根据接口获取 里面方法 返回值 使用反射
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


package test2_proxy.proxy;
 
import test2_proxy.service.OrderServiceImpl;
import test2_proxy.service.UserServiceImpl;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
/**
 * 基于接口的动态代理
 * 对于一些需要重复执行的验证功能或下一步操作,
 * 在核心方法执行前后都会执行增强的功能
 */
public class ServiceProxy {
 
    public static Object newProxyInstance(Object target){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("动态增强功能1:登录权限认证");
                System.out.println("动态增强功能2:黑名单验证");
                System.out.println("=====================");
                Object invoke = method.invoke(target, args);//执行被代理的核心业务功能
                System.out.println("=====================");
                System.out.println("动态增强功能3:进入订单中心");
                System.out.println("此处省略一万行(●—●)...");
                return invoke;
            }
        });
    }
}
 
***********************
 
package test2_proxy.service;
 
/**
 * 用户登录、注册、找回密码等一系列服务的接口
 */
public interface UserService {
    public void testUserService();
}
 
************************
 
package test2_proxy.service;
 
import org.springframework.stereotype.Service;
 
/**
 * 实现用户服务接口的类
 */
@Service
public class UserServiceImpl implements UserService {
    @Override
    public void testUserService() {
        System.out.println("UserService核心功能");
    }
}
 
***************************
 
package test2_proxy.service;
 
/**
 * 订单服务接口,如下单、取消订单、放入购物车等
 */
public interface OrderService {
 
    public void testOrderService();
}
 
***************************
 
package test2_proxy.service;
 
/**
 * 实现订单核心功能接口的类
 */
public class OrderServiceImpl implements OrderService {
    @Override
    public void testOrderService() {
        System.out.println("OrderService核心功能");
    }
}
 
***************************
 
package test2_proxy;
 
import test2_proxy.proxy.ServiceProxy;
import test2_proxy.service.OrderService;
import test2_proxy.service.OrderServiceImpl;
import test2_proxy.service.UserService;
import test2_proxy.service.UserServiceImpl;
 
/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        UserService userService=new UserServiceImpl();
        userService = (UserService)ServiceProxy.newProxyInstance(userService);
        userService.testUserService();
        System.out.println("***************************");
        OrderService orderService=new OrderServiceImpl();
        orderService = (OrderService)ServiceProxy.newProxyInstance(orderService);
        orderService.testOrderService();
    }
}

3.Cglib代理
不能代理Final的接口

如果加入容器的目标对象有实现接口,用JDK代理
如果目标对象没有实现接口,用Cglib代理
在这里插入图片描述


package test3_proxy_cglib.proxy;
 
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
 
import java.lang.reflect.Method;
import java.util.Arrays;
 
/**
 * 动态代理类
 */
public class ServiceProxy {
    public static Object newProxyInstance(Object target) {
        //1.工具类
        Enhancer enhancer = new Enhancer();
        //2.设置父类,传递类对象
        enhancer.setSuperclass(target.getClass());
        //3.设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("cglib增强功能1");
                System.out.println("cglib增强功能2");
                System.out.println("此处省略一万行(●—●)...");
                System.out.println("==================");
                return method.invoke(target, objects);
            }
        });
        //4.功能增强后,返回代理对象
        return enhancer.create();
    }
}
 
****************************
 
package test3_proxy_cglib;
 
/**
 * 用户服务功能类
 */
public class UserService {
    public void testUserService(){
        System.out.println("UserService核心功能");
    }
}
 
*****************************
 
package test3_proxy_cglib;
 
/**
 * 订单服务功能类
 */
public class OrderService {
    public void testOrderService(){
        System.out.println("OrderService核心功能");
    }
}
 
**********************************
 
package test3_proxy_cglib;
 
import test3_proxy_cglib.proxy.ServiceProxy;
 
/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        UserService userService=new UserService();
        userService= (UserService)ServiceProxy.newProxyInstance(userService);
        userService.testUserService();
        System.out.println("***************************");
        OrderService orderService=new OrderService();
        orderService=(OrderService)ServiceProxy.newProxyInstance(orderService);
        orderService.testOrderService();
    }
}

参考

https://www.cnblogs.com/leeego-123/p/10995975.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值