配置文件
<?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="myServiceImpl" class="org.example.ba.impl.myServiceImpl"/> <!-- 切面对象--> <bean id="myAspect" class="org.example.ba.myAspect"/> <!-- 自动代理生成器--> <aop:aspectj-autoproxy/> </beans>
DEMO
@Aspect public class myAspect { /* //前置通知 定义方法,方法是实现切面功能的。方法的定义要求: 1.公共方法 public 2.方法没有返回值 3.方法名称自定义 4.方法可以有参数,也可以没有参数。 如果有参数,参数不是自定义的,有几个参数类型可以使用。 指定通知方法中的参数: Joinpoint Joinpoint: 业务方法,要加人切面功能的业务方法 作用是:可以在通知方法中获取方法执行时的信息,例如方法名称, 方法的实参。如果你的切面功能中需要用到方法的信息,就加入Joinpoint. 这个JoinPoint参数的值是由框架赋予,必须是第一个位置的参数*/ /* @Before(value = "execution(public void org.example.ba.impl.myServiceImpl.init(..))") public void doAspect(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); for (Object arg : args) { System.out.println("方法的参数arg======"+arg); } Signature signature = joinPoint.getSignature(); System.out.println("方法的定义签名signature======"+signature); String name = joinPoint.getSignature().getName(); System.out.println("方法的名称name======="+name); System.out.println("doAspect"); } */ /* // 后置通知 后置通知定义方法,方法是实现切面功能的。方法的定义要求: 1.公共方法 public 2.方法没有返回值 3.方法名称自定义 4.方法有参数的,推荐是object,参数名自定义 注解有returning属性 在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回 值。该注解的 returning 属性就是用于指定接收方法返回值的变量名的。所以,被注解为后 置通知的方法,除了可以包含 JoinPoint 参数外,还可以包含用于接收返回值的变量。该变 量最好为 Object 类型,因为目标方法的返回值可能是任何类型。*/ /*2.returning自定义的变量, 表示目标方法的返回值的。 自定义变量名必须和通知方法的形参名一样。 */ /* @AfterReturning(value = "execution(* *..*.myServiceImpl.destroy(..))", returning = "o") public void doAspect(Object o){ System.out.println("returning返回值====="+o); } */ //环绕通知 /*环绕通知方法的定义格式 1.public 2.必须有一个返回值,推荐使用object 3.方法名称自定义 4.方法有参数,固定的参数 ProceedingJoinpoint */ @Around(value = "execution(* org.example.ba.impl.myServiceImpl.destroy(..))") public Object doinit(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { Object proceed =null; System.out.println("方法运行之前时间"+new Date()); proceed=proceedingJoinPoint.proceed();//等于 Object proceed=destroy() System.out.println("方法运行之后时间"+new Date()); System.out.println(proceed); return proceed; } }