切面编程
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程技术,它允许开发者定义横切关注点(cross-cutting concerns),这些关注点会跨越多个应用模块,如日志记录、事务管理、安全检查等。
Java中的代理
在Java中,代理是一种设计模式,它提供了一种方式来控制或扩展其他对象的行为。代理模式涉及到一个接口、一个实现该接口的实体类,以及一个代理类,这个代理类同样实现该接口。代理类负责处理对实体类的请求,并在必要时添加额外的逻辑。
Java提供了两种方式来创建代理对象:静态代理和动态代理。
一、静态代理
静态代理在代码编译时就已经确定,代理类和被代理类通常都实现相同的接口。代理类中包含对被代理类的引用,并在其方法调用前后添加额外的逻辑。这种方式需要为每个被代理类手动编写一个代理类,因此不够灵活。
二、动态代理
动态代理在运行时才创建代理对象,因此更加灵活。Java提供了两种实现动态代理的机制:java.lang.reflect.Proxy类和CGLIB库。
使用java.lang.reflect.Proxy类
java.lang.reflect.Proxy类用于创建实现了指定接口的动态代理实例。要使用Proxy类创建动态代理对象,需要实现InvocationHandler接口,并在invoke方法中定义当代理对象上的方法被调用时应该执行的逻辑。
使用CGLIB库
当需要代理的类没有实现任何接口时,可以使用CGLIB库创建代理对象。CGLIB库可以动态生成被代理类的子类,并覆盖其中的方法。这样,当调用代理对象的方法时,就会触发额外的逻辑。
要使用CGLIB创建代理对象,需要添加CGLIB库到项目的依赖中,并创建一个实现了MethodInterceptor接口的类。然后,使用Enhancer类创建代理对象,并设置回调接口的实现。
简单实现一个代理
一、Java动态代理简单实现切面编程
// 方法监测注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodMonitor {
}
// 接口
public interface MyInterface {
@MethodMonitor
String myMethodExecute();
}
// 接口实现类
public class MyClass implements MyInterface{
@Override
public String myMethodExecute() {
return "MyClass.myMethodExecute";
}
}
// 切面类
public class MethodMonitorAspect {
public static Object monitorMethorExecution(Object target, Method method, Object[] args) throws Exception {
long startTimes = System.currentTimeMillis();
Object invokeResult = method.invoke(target, args);
long endTimes = System.currentTimeMillis();
System.out.println("MethodMonitorAspect.monitorMethorExecution:执行时间 "+(endTimes-startTimes));
return invokeResult;
}
}
// 代理工厂,生成代理类
public class MethodMonitorProxyFactory {
private static Logger logger = Logger.getLogger(MethodMonitorProxyFactory.class);
@SuppressWarnings("unchecked")
public static <T> T createProxy(T target, Class<T> interfaceType) {
return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), new Class<?>[] {
interfaceType }, new InvocationHandler() {
@Override
public