Spring - AOP 简单使用步骤
1、引入 jar:
<!-- aspectj 的jar-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<!-- aspectj 的jar-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
<!-- aspectj 的jar-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<!-- aop需要的jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
2、xml命名空间
注意:在 spring-mvc.xml 的xml中定义
<beans xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--IOC自动扫包-->
<context:component-scan base-package="com.. .web"/>
<!--定义切面目标类-->
<bean class="com...common.AspectjConfig"/>
<!--使用AOP注解-->
<aop:aspectj-autoproxy expose-proxy="true"/>
3、java 切面类
/**
* Aspectj切面类 - 记录日志工具类
*
* @author Xin
*/
@Aspect
public class AspectjConfig {
private Logger logger = LoggerFactory.getLogger(AspectjConfig.class);
@Autowired
private BidderLogMapper bidderLogDao;
// 匹配所有web(ServiceImpl)包下面的所有类的所有方法
@Pointcut("execution(* com.jiuan.bidding.web.*.*(..))")
public void addLog(JoinPoint joinPoint) {
logger.info("addlog");
}
//所有的通知都可以使用这种方式,直接把Pointcut跟Advice连接起来,但是为了更好的理解前文的概念以及图片,这边分开定义。
//@Before("execution(* com.ctc.ServiceImpl.*.*(..))") 前置通知
@Before("addLog()")
public void before(JoinPoint joinPoint) {
logger.info("前置通知.................");
//获取当前请求对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
}
/**
* 后置通知
*/
@AfterReturning("addLog()")
public void AfterReturning(JoinPoint joinPoint) {
logger.info("进入 后置通知");
logger.info("退出 后置通知");
}
/**
* 异常通知
*/
@AfterThrowing("addLog()")
public void AfterThrowing(JoinPoint joinPoint) {
logger.info("抛出异常!");
}
/**
* 最终通知
*/
@After("addLog()")
public void After(JoinPoint joinPoint) {
logger.info("LogAdvice after advice ");
}
//除了可以通过名字来指向对应的切入点表达式,还可以可以使用'&&', '||' 和 '!'来合并。
//切入点表达式的 args(user,..) 表示某个与切入表达式匹配的连接点它把User对象作为第一个参数,通过这个语法我们可以在通知中访问到这个User对象。
@Around("addLog()&&" + "args(User,..)")
public void around(ProceedingJoinPoint joinPoint, User user) throws Throwable {
joinPoint.proceed();
}
}