本文目录导读:

我为您提供几种Java实现AOP的典型案例代码,包括Spring AOP和原生动态代理两种方式:
Spring AOP实现(基于注解)
添加依赖(pom.xml)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
自定义日志切面
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
// 定义切点:所有service包下的所有方法
@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {}
// 前置通知
@Before("servicePointcut()")
public void before(JoinPoint joinPoint) {
System.out.println("执行前:方法名:" + joinPoint.getSignature().getName());
System.out.println("参数:" + Arrays.toString(joinPoint.getArgs()));
}
// 后置通知(方法正常执行后)
@AfterReturning(pointcut = "servicePointcut()", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
System.out.println("执行后:返回结果:" + result);
}
// 异常通知
@AfterThrowing(pointcut = "servicePointcut()", throwing = "exception")
public void afterThrowing(JoinPoint joinPoint, Exception exception) {
System.out.println("异常通知:异常信息:" + exception.getMessage());
}
// 环绕通知
@Around("servicePointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕通知-开始");
long startTime = System.currentTimeMillis();
try {
Object result = pjp.proceed(); // 执行目标方法
return result;
} catch (Exception e) {
throw e;
} finally {
long endTime = System.currentTimeMillis();
System.out.println("环绕通知-结束,执行时间:" + (endTime - startTime) + "ms");
}
}
}
业务服务类
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserInfo(String username) {
System.out.println("业务方法:查询用户信息");
if (username == null) {
throw new IllegalArgumentException("用户名不能为空");
}
return "用户:" + username;
}
public void deleteUser(int userId) {
System.out.println("业务方法:删除用户ID=" + userId);
}
}
Spring AOP基于XML配置(传统方式)
切面类
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAspectXml {
public void beforeMethod(ProceedingJoinPoint pjp) {
System.out.println("XML配置前置通知");
}
public void afterMethod(ProceedingJoinPoint pjp) {
System.out.println("XML配置后置通知");
}
public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("XML环绕通知-开始");
Object result = pjp.proceed();
System.out.println("XML环绕通知-结束");
return result;
}
}
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 业务类 -->
<bean id="userService" class="com.example.service.UserService"/>
<!-- 切面类 -->
<bean id="logAspect" class="com.example.aspect.LogAspectXml"/>
<!-- AOP配置 -->
<aop:config>
<aop:aspect ref="logAspect">
<!-- 定义切点 -->
<aop:pointcut id="servicePointcut"
expression="execution(* com.example.service.*.*(..))"/>
<!-- 前置通知 -->
<aop:before method="beforeMethod" pointcut-ref="servicePointcut"/>
<!-- 后置通知 -->
<aop:after method="afterMethod" pointcut-ref="servicePointcut"/>
<!-- 环绕通知 -->
<aop:around method="aroundMethod" pointcut-ref="servicePointcut"/>
</aop:aspect>
</aop:config>
</beans>
原生JDK动态代理实现(不用框架)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
public class LogProxy implements InvocationHandler {
private Object target;
public LogProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理-方法执行前:" + new Date());
// 调用目标方法
Object result = method.invoke(target, args);
System.out.println("JDK代理-方法执行后:" + new Date());
return result;
}
// 获取代理对象
@SuppressWarnings("unchecked")
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
}
// 接口
interface UserServiceInterface {
String getUserInfo(String username);
void deleteUser(int userId);
}
// 实现类
class UserServiceImpl implements UserServiceInterface {
@Override
public String getUserInfo(String username) {
System.out.println("业务实现:查询用户信息");
return "用户:" + username;
}
@Override
public void deleteUser(int userId) {
System.out.println("业务实现:删除用户ID=" + userId);
}
}
// 使用示例
public class ProxyDemo {
public static void main(String[] args) {
UserServiceInterface target = new UserServiceImpl();
LogProxy logProxy = new LogProxy(target);
UserServiceInterface proxy = logProxy.getProxy();
// 调用代理方法
String userInfo = proxy.getUserInfo("张三");
System.out.println("返回结果:" + userInfo);
proxy.deleteUser(1);
}
}
CGLIB代理实现(无需接口)
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
System.out.println("CGLIB代理-方法执行前");
Object result = proxy.invokeSuper(obj, args);
System.out.println("CGLIB代理-方法执行后");
return result;
}
// 创建代理对象
@SuppressWarnings("unchecked")
public <T> T createProxy(Class<T> targetClass) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(this);
return (T) enhancer.create();
}
}
// 测试类(无需接口)
class ProductService {
public String getProductInfo(String name) {
System.out.println("商品服务:获取商品信息");
return "商品:" + name;
}
public void deleteProduct(int productId) {
System.out.println("商品服务:删除商品ID=" + productId);
}
}
// 使用示例
public class CglibDemo {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
ProductService productService = proxy.createProxy(ProductService.class);
String result = productService.getProductInfo("手机");
System.out.println("返回结果:" + result);
productService.deleteProduct(100);
}
}
实际应用案例:事务管理切面
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
@Aspect
@Component
public class TransactionAspect {
// 使用Spring事务模板
@Around("@annotation(tx)") // 使用自定义注解标记
public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("事务开始");
try {
// 伪事务操作
Object result = pjp.proceed();
System.out.println("事务提交");
return result;
} catch (Exception e) {
System.out.println("事务回滚");
throw e;
} finally {
System.out.println("事务结束");
}
}
}
// 自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTransaction {
}
// 使用示例
@Service
public class OrderService {
@MyTransaction
public void createOrder(String orderNo) {
System.out.println("创建订单:" + orderNo);
// 业务逻辑
}
@MyTransaction
public void updateOrder(Long orderId) {
System.out.println("更新订单:" + orderId);
// 业务逻辑
}
}
性能监控切面
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class PerformanceMonitor {
@Around("execution(* com.example.service.*.*(..))")
public Object monitorPerformance(ProceedingJoinPoint pjp) throws Throwable {
String methodName = pjp.getSignature().getName();
String className = pjp.getTarget().getClass().getSimpleName();
long start = System.currentTimeMillis();
try {
Object result = pjp.proceed();
long executionTime = System.currentTimeMillis() - start;
System.out.println(String.format(
"方法%s.%s执行时间:%d ms", className, methodName, executionTime));
// 检查性能阈值
if (executionTime > 1000) {
System.err.println(String.format(
"警告:方法%s.%s执行过慢!", className, methodName));
}
return result;
} catch (Throwable t) {
long executionTime = System.currentTimeMillis() - start;
System.err.println(String.format(
"方法%s.%s执行异常,耗时:%d ms", className, methodName, executionTime));
throw t;
}
}
}
- Spring AOP:最常用,支持注解和XML配置,适合企业应用
- JDK动态代理:基于接口,轻量级
- CGLIB代理:基于继承,无需接口
- 性能监控、事务管理:实际应用中的典型场景
选择建议:
- 项目使用Spring框架:优先选择Spring AOP注解方式
- 简单场景:使用JDK动态代理或CGLIB
- 需要高级特性(如拦截器链):考虑AspectJ
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播