package com.sinosoft.demo;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @ClassName: SpringAOPTest
* @Description: Spring AOP 面向切面编程
* @author: Created by xushuyi <a href="xu_shuyi1002@163.com">Contact author</a>
* @date: 2019/7/17 9:29
* @Version: V1.0
*/
public class SpringAOPTest {
/**
* 两种方式
* 1. Java默认的jdk动态代理
* 2. 第三方代码生成库的cglib动态代理
*/
}
/**
* 测试Java 中默认的jdk动态代理
*/
class MyJdkProxy implements InvocationHandler {
/**
* 需要被代理的目标对象
*/
private Object proxyObject;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk动态代理,监听开始!");
Object result = method.invoke(proxyObject, args);
System.out.println("jdk动态代理,监听结束!");
return result;
}
/**
* 获取代理的实例对象
*
* @param targetObject
* @return
*/
private Object getProxyInstance(Object targetObject) {
this.proxyObject = targetObject;
return Proxy.newProxyInstance(
proxyObject.getClass().getClassLoader(),
proxyObject.getClass().getInterfaces(),
this::invoke
);
}
public static void main(String[] args) {
MyJdkProxy myJdkProxy = new MyJdkProxy();
UserService userService = (UserService) myJdkProxy.getProxyInstance(new UserServiceImpl());
userService.addUser("徐书一");
}
}
class UserServiceImpl implements UserService {
@Override
public void addUser(String userName) {
System.out.println("调用了新增的方法,传入的参数为:" + userName);
}
}
interface UserService {
void addUser(String userName);
}
/**
* 测试cglib动态代理
*/
class CglibProxy implements MethodInterceptor {
/**
* 被代理对象
*/
private Object proxyObject;
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib动态代理,监听开始!");
Object result = method.invoke(proxyObject, objects);
System.out.println("cglib动态代理,监听结束!");
return result;
}
/**
* 获取代理的实例
*
* @param targetObject
* @return
*/
private Object getCglibProxyInstance(Object targetObject) {
this.proxyObject = targetObject;
Enhancer enhancer = new Enhancer();
// 设置父类,因为cglib是针对指定的类派生出一个子类,所以需要指定父类
enhancer.setSuperclass(targetObject.getClass());
// 设置回调
enhancer.setCallback(this);
// 创建并返回代理对象所派生的子类对象
return enhancer.create();
}
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
AgentServiceImpl agentService = (AgentServiceImpl) cglibProxy
.getCglibProxyInstance(new AgentServiceImpl());
agentService.addAgent("小苗");
}
}
class AgentServiceImpl {
public String addAgent(String name) {
System.out.println("新增代理人:" + name);
return name;
}
}