spring_mvc_aop_总结

定义

aop,面向切面编程。开发工作中,我们往往只想关注业务需求的逻辑实现,但是我们也需要了解系统的性能、日记记录等等,但是如果每次都在实现业务的地方加入记录性能的实现,这样就大大的耦合了业务逻辑实现和框架实现。 为此aop的目的是将与业务逻辑无关的需求分离开来独立实现,可以用来实现日志记录、性能统计、安全控制、事务处理等模块。主要原理是拦截器和反射。

使用方法

引用springMVC 3.2.3.RELEASE包

1
2
3
4
5
6
7
8
9
10
11
12
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.1</version>
</dependency>
<!-- 方式一实现的时候并未报错 后面研究一下-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.1</version>
</dependency>

方式一:基于注解的aop实现

1
2
3
4
5
//context文件中扫描新增的aop类
<mvc:annotation-driven />
<context:component-scan base-package="com.yyy.web.mess.aop"/>

<aop:aspectj-autoproxy proxy-target-class="false" />

对应的java 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yyy.web.mess.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AopTest {
//此处有多种方式 before、after、Around、AfterReturning、AfterThrowing等等后面详细介绍
@After("execution(* com.yyy.web.mess.controller.AopController.*(..))")
public void afterDo(){
System.out.println("controller aop!");
}

}

基于配置文件的实现

1
2
3
4
5
6
7
8
9
10
<aop:aspectj-autoproxy proxy-target-class="false" />
//将对应的aop注入到框架中
<beans:bean id="aoptest" class="com.yyy.web.mess.aop.AopTest"></beans:bean>
<aop:config>
<aop:aspect id="after" ref="aoptest">
<aop:pointcut id="pointcut"
expression="execution(* com.yyy.web.mess.controller.AopController.*(..) )" />
<aop:around pointcut-ref="pointcut" method="afterDo"/>
</aop:aspect>
</aop:config>

对应的java实现,无注解

1
2
3
4
5
6
public class AopTest {

public void afterDo(){
System.out.println("controller aop!");
}
}