AOP实现异常处理

247 阅读2分钟

一、什么是AOP?

aspect oriented programming(面向切面编程),以面向对象编程为基础,主要关注的是方面,方面组件主要用来封装通用的逻辑,可以以低耦合的方式切入到某一批目标对象中。 作用:主要解决的是一对多组件的调用问题,以低耦合的方式指定组件之间的调用关系。

二、步骤

1.引入spring-context.jar spring-aspects.jar

2.定义方面组件loggerBean

3..在spring配置文件中,添加aop配置

 <aop:config>
      <!--定义切入点,指定目标组件-->
      <aop:pointcut id="controllerPointCut" expression="within(com.qf.controller.*)"/>
      <!--定义方面-->
      <aop:aspect id="loggerAspect" ref="loggerBean">
           <!--定义通知-->
           <aop:before method="logger" pointcut-ref="controllerPointCut"></aop:before>
      </aop:aspect>
 </aop:config>

相关概念:

1)切面(aspect) 指的是封装了共通处理的功能组件,该组件可以作用到某一批目标组件上

2)切入点(pointcut) 用于指定目标组件的表达式,方面组件和某一批目标组件的方法有关系

3)连接点(joinPoint) 切入点是连接点的集合,方面组件和某一个目标组件的方法有关系

4)通知(advice) 用于指定方面组件和目标组件方法之间的作用时机,比如先执行方面组件在执行目标组件

5)目标(target) 利用切入点指定的组件和方法

6)动态代理(autoProxy) spring采用了到动态代理的技术实现了AOP机制,当使用了AOP之后,从容器中getBean()获取的目标组件,返回的是一个动态代理类,调用代理类的方法,该代理类根据通知类型负责调用方面组件和目标组件的方法。

spring提供了两种动态代理的技术:

--采用CGLIB技术实现,目标组件没有接口实现则采用该方式 public class 代理类 extends 原目标类型{}

--采用Proxy技术实现,目标组件有接口实现则采用proxy方式 public class 代理类 implement 原目标类型{}

获取日志器,记录文件中,就可以进行测试了有没有实现异常处理了

public class ExceptionBean {
    //获取日志器
    Logger logger = Logger.getLogger(ExceptionBean.class);
    public void exec(Exception ex){
        //记录到文件中
        logger.error("##记录异常信息##");
        logger.error("异常类型:"+ex);
        StackTraceElement[] stackTrace = ex.getStackTrace();
        Arrays.stream(stackTrace).forEach(s->{logger.error(s);});
    }
}

记录到文件中,需要log4j的jar,以及log4j配置文件。

log4j.properties

#logger level
log4j.rootLogger=debug,myconsole,myfile
#appender
log4j.appender.myconsole=org.apache.log4j.ConsoleAppender
log4j.appender.myfile=org.apache.log4j.FileAppender
log4j.appender.myfile.File=E:\mylog.txt
#layout
log4j.appender.myconsole.layout=org.apache.log4j.TTCCLayout
log4j.appender.myfile.layout=org.apache.log4j.PatternLayout
log4j.appender.myfile.layout.ConversionPatten=[%t] %5p -%m%n

附加:定制模板 新建配置文件new时,直接使用log4j

image.png