- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、什么是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