AOP是面向切面编程,利用这个技术可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分的耦合性降低,提高代码的可重用性,同时提高开发效率(来自百度百科)。
Spring AOP有两种实现方式,一种是在spring-mvc中进行配置,一种是通过注解的方式实现。
//封装共同处理:将异常信息写入文件中(日志) @Component @Aspect public class ExceptionHanlder { //定义规则:public void 方法名(异常类型参数)//异常通知 @AfterThrowing(throwing="e",pointcut="within(org.controller..*)") public void handler(Exception e){ //e变量就是目标组件抛出的异常对象 try {//以追加方式写入 FileWriter fw = new FileWriter("note.log",true); PrintWriter pw = new PrintWriter(fw); //打印错误标题 pw.println("************************************"); pw.println("异常类型:"+e); pw.println("发生时间:"+new Date()); pw.println("************************************"); e.printStackTrace(pw);//将异常栈信息写入note.log pw.flush(); } catch (IOException e1) { System.out.println("记录异常日志失败"); } finally{ pw.close(); fw.close(); } } }
############################################################################################# package org.aopTest.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; //封装共同处理的组件 @Component//扫描,等价于<bean>定义 @Aspect//等价于<aop:aspect ref=""> public class LoggerBean { //要在Controller.execute开始位置切入 //方法规则:public void 方法名(){...} (前置通知) @Before("within(org.aopTest.controller..*)") //等价于<aop:before method="logController" pointcut=""> public void logController(){ System.out.println("进入Controller组件处理"); } } ################################################################################################## 【注解方式】 <!-- AOP注解配置 --> <!-- 利用组件扫描,将Aspect组件纳入Spring容器 --> <context:component-scan base-package="org.aopTest.aspect"/> <!-- 开启AOP注解支持@Aspect,@Before等 --> <aop:aspectj-autoproxy proxy-target-class="true"/> ################################################################################################## 【javaBean方式】 <!-- 定义共同处理组件 --> <bean id="loggerBean" class="org.aopTest.aspect.LoggerBean"> </bean> <!-- 将loggerBean组件切入到Controller方法上 --> <aop:config> <!-- 要切入哪个共同处理组件,ref指定共同组件id值 --> <aop:aspect ref="loggerBean"> <!-- aop:before表示在目标方法之前切入, method指定方法名;pointcut指定目标组件 --> <aop:before method="logController" pointcut="within(org.aopTest.controller..*)"/> </aop:aspect> </aop:config> <!-- 采用AOP方法追加记录异常日志 --> <bean id="exceptionHanlder" class="org.aopTest.aspect.ExceptionHanlder"> </bean> <aop:config> <aop:aspect ref="exceptionHanlder"> <aop:after-throwing method="handler" throwing="e" pointcut="within(org.aopTest.controller..*)"/> </aop:aspect> </aop:config> ##################################################################################################