Spring AOP注解案例
applicationContext.xml配置
<?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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.hxj"/><aop:aspectj-autoproxy/></beans>
接口代码
package com.hxj.dao;public interface UserService {public void addUser(String username);public void deleteUser(String username);public String getUser(String username);
}
接口实现类
package com.hxj.dao;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService{@Overridepublic void addUser(String username) {System.out.println("正在添加用户: " + username);if (username == null || username.isEmpty()) {throw new IllegalArgumentException("用户名不能为空");}}@Overridepublic void deleteUser(String username) {System.out.println("正在删除用户: " + username);if (username == null || username.isEmpty()) {throw new IllegalArgumentException("用户名不能为空");}}@Overridepublic String getUser(String username) {System.out.println("正在查询用户: " + username);return "用户信息: " + username;}
}
切面类
package com.hxj.dao;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;import java.util.Arrays;
@Component
@Aspect
public class LoggingAspect {@Pointcut("execution(* com.hxj.dao.*.*(..))")public void pic(){}@Before("pic()")public void logBefore(JoinPoint joinPoint) {System.out.println("======= 前置通知 =======");System.out.println("方法签名: " + joinPoint.getSignature().toShortString());System.out.println("方法参数: " + Arrays.toString(joinPoint.getArgs()));System.out.println("目标对象: " + joinPoint.getTarget().getClass().getSimpleName());
}@After("pic()")public void logAfter(JoinPoint joinPoint) {System.out.println("======= 后置通知 =======");System.out.println("方法 " + joinPoint.getSignature().getName() + " 执行完毕");}@AfterReturning(pointcut = "pic()", returning = "result")public void logAfterReturning(JoinPoint joinPoint, Object result) {System.out.println("======= 返回通知 =======");System.out.println("方法 " + joinPoint.getSignature().getName() + " 执行成功");System.out.println("返回值: " + result);}@AfterThrowing(pointcut = "pic()", throwing = "ex")public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {System.out.println("======= 异常通知 =======");System.out.println("方法 " + joinPoint.getSignature().getName() + " 执行异常");System.out.println("异常信息: " + ex.getMessage());}@Around("pic()")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("======= 环绕通知开始 =======");long startTime = System.currentTimeMillis();try {Object result = joinPoint.proceed();long endTime = System.currentTimeMillis();System.out.println("方法执行时间: " + (endTime - startTime) + "ms");return result;} catch (Throwable throwable) {System.out.println("方法执行出现异常: " + throwable.getMessage());throw throwable;} finally {System.out.println("======= 环绕通知结束 =======");}}@Pointcut("@annotation(com.hxj.dao.LogExecutionTime)")public void logExecutionTimeAnnotation() {}@Around("logExecutionTimeAnnotation()")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = joinPoint.proceed();long endTime = System.currentTimeMillis();System.out.println(joinPoint.getSignature() + " 执行时间: " + (endTime - startTime) + "ms");return result;}
}
测试方法
package com.hxj.test;import com.hxj.dao.PerformanceService;
import com.hxj.dao.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean(UserService.class);System.out.println("========== 正常执行测试 ==========");userService.addUser("张三");
}
}