2.2 自动注解 AOP
在上述 2.1 中我们通过 xml 配置的形式 实现了 AOP 编程, 现在我们通过不配置 xml, 配置注解的形式实现 AOP.
2.2.1 配置自动代理
使用配置注解, 首先我们要将切面在 spring 上下文中声明成自动代理 bean, 我们需要在 web 层的
web-inf/dispatcher-servlet.xml
文件中配置如下一句话即可
<aop:aspectj-autoproxy />
当然我们需要在 xml 的根目录 beans 下引用 aop 的命名空间和 xsi
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
2.2.2 使用 @Aspect 注解
声明一个切面, 只需要在类名上添加 @Aspect 属性即可, 具体的连接点, 我们用 @Pointcut 和 @Before,@After 等标注. 具体如下在声明前 我们需要依赖配置 pom
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
声明切面类, 包含了注解 @Aspect 以及何时 (如 @Before) 执行通知
package com.ganji.demo.service.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Service;
/**
* Created by admin on 2015/9/2.
*/
@Aspect
@Service
public class XmlAopDemoUserLog {
// 配置切点 及要传的参数
@Pointcut("execution(* com.ganji.demo.service.user.UserService.GetDemoUser(..)) && args(id)")
public void pointCut(int id)
{
}
// 配置连接点 方法开始执行时通知
@Before("pointCut(id)")
public void beforeLog(int id) {
System.out.println("开始执行前置通知 日志记录:"+id);
}
// 方法执行完后通知
@After("pointCut(id)")
public void afterLog(int id) {
System.out.println("开始执行后置通知 日志记录:"+id);
}
// 执行成功后通知
@AfterReturning("pointCut(id)")
public void afterReturningLog(int id) {
System.out.println("方法成功执行后通知 日志记录:"+id);
}
// 抛出异常后通知
@AfterThrowing("pointCut(id)")
public void afterThrowingLog(int id) {
System.out.println("方法抛出异常后执行通知 日志记录"+id);
}
// 环绕通知
@Around("pointCut(id)")
public Object aroundLog(ProceedingJoinPoint joinpoint,int id) {
Object result = null;
try {
System.out.println("环绕通知开始 日志记录"+id);
long start = System.currentTimeMillis();
// 有返回参数 则需返回值
result = joinpoint.proceed();
long end = System.currentTimeMillis();
System.out.println("总共执行时长" + (end - start) + "毫秒");
System.out.println("环绕通知结束 日志记录");
} catch (Throwable t) {
System.out.println("出现错误");
}
return result;
}
}
2.2.3 总结
按照上述两个步骤, 使用注解实现 Aop 即可, 这里依赖了 IOC.
来源: http://www.bubuko.com/infodetail-2484695.html