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> ##################################################################################################