静态代理 动态代理区别 不需要写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