不使用Spring框架的时候,如何实现切面编程

本文介绍了在不使用Spring框架的情况下,如何通过静态代理、动态代理(包括Java反射代理和CGLIB库)实现切面编程。详细讲解了Java动态代理的InvocationHandler接口和CGLIB代理的Enhancer类,以及对比了手动实现AOP与Spring AOP的优缺点。
摘要由CSDN通过智能技术生成

切面编程

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值