JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。
- IUserService接口
package com.qfedu.aop01;
import java.util.List;
/**
* Created by HuangCong on 2020/2/26.
*/
public interface IUserService<T> {
List<T> getAllUser();
boolean saveUser(T user);
boolean deleteUser(int uid);
boolean updateUser(T obj);
}
- UserServiceImpl类
package com.qfedu.aop01;
import java.util.List;
/**
* Created by HuangCong on 2020/2/26.
*/
public class UserServiceImpl implements IUserService {
@Override
public List<Object> getAllUser() {
System.out.println("------getAllUser------");
return null;
}
@Override
public boolean saveUser(Object user) {
System.out.println("------saveUser------");
return false;
}
@Override
public boolean deleteUser(int uid) {
System.out.println("------deleteUser------");
return false;
}
@Override
public boolean updateUser(Object obj) {
System.out.println("------updateUser------");
return false;
}
}
- MyAspect类
package com.qfedu.aop01;
/**
* Created by HuangCong on 2020/2/26.
*/
public class MyAspect {
public void before() {
System.out.println("==========before=========");
}
public void after() {
System.out.println("========after========");
}
}
- UserFactory类
package com.qfedu.aop01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by HuangCong on 2020/2/26.
*/
public class UserFactory {
public static IUserService getUserService() {
IUserService us = new UserServiceImpl();
MyAspect ma = new MyAspect();
/**
* 使用Proxy类的静态方法newProxyInstance来实现对于目标对象us的代理
* 目的是在原本us可以做的事情之前和之后可以做额外的事情
* ClassLoader loader:指定当前target对象使用类加载器,获取加载器的方法是固定的;
* Class<?>[] interfaces:target对象实现的接口的类型,使用泛型方式确认类型.
* invocationHandler:事件处理,执行target对象的方法时,会触发事件处理器的方法,会把当前执行target对象的方法作为参数传入。
*/
IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理对象调用的回掉方法
* @param proxy 代理对象
* @param method 被代理的方法
* @param args 被代理方法的参数列表对象
* @return 每个方法的最终返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ma.before();
Object object = method.invoke(us, args);
ma.after();
return object;
}
});
return ius;
}
}
- TestAOP01类
package com.qfedu.aop01;
import org.junit.Test;
/**
* Created by HuangCong on 2020/2/26.
*/
public class TestAOP01 {
@Test
public void testUserService() {
/*
传统
*/
IUserService us = new UserServiceImpl();
Object obj = new Object();
us.getAllUser();
us.saveUser(obj);
us.deleteUser(1);
us.updateUser(obj);
System.out.println("======================================");
/*
AOP_01
*/
IUserService us2 = UserFactory.getUserService();
us2.getAllUser();
us2.saveUser(obj);
us2.deleteUser(1);
us2.updateUser(obj);
}
}