- 两种方式:
a) 使用Annotation
b) 使用xml
- Annotation
a) 加上对应的xsd文件spring-aop.xsd
b) beans.xml <aop:aspectj-autoproxy />
c) 此时就可以解析对应的Annotation了
d) 建立我们的拦截类
e) 用@Aspect注解这个类
f) 建立处理方法
g) 用@Before来注解方法
h) 写明白切入点(execution …….)
i) 让spring对我们的拦截器类进行管理@Component
- 常见的Annotation:
a) @Pointcut 切入点声明 以供其他方法使用 , 例子如下:
1 @Aspect 2 @Component 3 public class LogInterceptor { 4 5 @Pointcut("execution(public * com.bjsxt.dao..*.*(..))") 6 public void myMethod(){} 7 8 @Around("myMethod()") 9 public void before(ProceedingJoinPoint pjp) throws Throwable{ 10 System.out.println("method before"); 11 pjp.proceed(); 12 } 13 @AfterReturning("myMethod()") 14 public void afterReturning() throws Throwable{ 15 System.out.println("method afterReturning"); 16 } 17 @After("myMethod()") 18 public void afterFinily() throws Throwable{ 19 System.out.println("method end"); 20 } 21 }
- 织入点语法
a) void !void
b) 参考文档(* ..)
如果 execution(* com.bjsxt.dao..*.*(..))中声明的方法不是接口实现 则无法使用AOP实现动态代理,此时可引入包” cglib-nodep-2.1_3.jar” 后有spring自动将普通类在jvm中编译为接口实现类,从而打到可正常使用AOP的目的.
- xml配置AOP
a) 把interceptor对象初始化
b) <aop:config
-
i. <aop:aspect …..
- <aop:pointcut
- <aop:before
例子:
1 <bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean> 2 <aop:config> 3 <!-- 配置一个切面 --> 4 <aop:aspect id="point" ref="logInterceptor"> 5 <!-- 配置切入点,指定切入点表达式 --> 6 <!-- 此句也可放到 aop:aspect标签外 依然有效--> 7 <aop:pointcut 8 expression= 9 "execution(public * com.bjsxt.service..*.*(..))" 10 id="myMethod" /> 11 <!-- 应用前置通知 --> 12 <aop:before method="before" pointcut-ref="myMethod" /> 13 <!-- 应用环绕通知 需指定向下进行 --> 14 <aop:around method="around" pointcut-ref="myMethod" /> 15 <!-- 应用后通知 --> 16 <aop:after-returning method="afterReturning" 17 pointcut-ref="myMethod" /> 18 <!-- 应用抛出异常后通知 --> 19 <aop:after-throwing method="afterThrowing" 20 pointcut-ref="myMethod" /> 21 <!-- 应用最终通知 --> 22 <aop:after method="afterFinily" 23 pointcut="execution(public * om.bjsxt.service..*.*(..))" /> 24 </aop:aspect> 25 </aop:config>