AOP
,即面向切面编程,全称为Aspect Oriented Programming,第一次接触的面向切面的人会说:“我知道面向过程编程,面向对象编程,面向切面是什么?”一个简单的例子可以让大家理解什么是面向切面。
如果你是一个工作者,你每天的从进入起,大致工作是这样的:
上班打卡->努力地工作->下班打卡;
如果你是一个教师或热爱学习的大学生,进入教室后的经历可能是这样的:
教授刚上课时点名答到->听教师讲课->教授下课前点名答到(如果不幸的话)。
作为一个上班族来说,你的核心工作就是工作,上下班打卡似乎不是你应该做的事情,但是你却不得不做,因为不打卡公司可能会认为你没工作,你或是要去找人事出各种手续与证明,或是面临扣工资的风险,这无疑是非常不幸的。也或许你是十分幸运,有一个开明的老板,但幸运很难发生在每一个人身上。
这里我们以一个worker举例,本来你的工作是这样的:
public void work()
{
//做你的核心工作
doYourCoreWorkd();
}
因为打卡你的工作变成了这样:
Public object work()
{
//上班打卡
signForWork();
//做你的核心工作
doYourCoreWork();
//下班打卡
signtForRest();
}
这时你可能会想,如果我进入公司自动记录上下班时间就好了。如果有一个人专门来记录其他工作者的上下班时间,那对其他工作者来说,就不用费心在打卡上面了,这就是面向切面的一个原型。但如果直接让员工来记录其他员工的上下班时间,一个需要人力资源,二则可能不准确,也许以后能出或可能已经出了这样的一套设备会来承担这样的工作,但实现或普及可能需要一点时间。
幸运的是,在程序中已经有了AOP。
AOP有什么用,最常用的可能就是log日志记录了。
以前我们可能这样写:
public void work()
{
logger.info(“我上班了”);
try
{
doMyWork();
logger.info(“我下班了”);
}
catch(Exception e)
{
logger.info(“工作出现了点问题,我还在加班”);
}
}
这样做逻辑上并没什么问题,但Logger信息其实与foo()方法本身无关。但借助AOP,我们可以直接这样写:
public void work()
{
doSomeThing();
}
这样看起来是不是清爽多了,但是我要怎样记录logger日志呢?
我们可以写一个名叫WorkMonitor的类,专门用于处理logger信息
@Pointcut("execution (* *.work(..))")
public void watch()
{
}
@Before("watch()")
public void before()
{
logger.info("唉,又开始上班了");
}
@AfterReturning("watch()")
public void afterSuccess()
{
logger.info("哈哈,我下班了。");
}
@AfterThrowing("watch()")
public void afterFailure()
{
logger.info("sad,工作出现了点问题,我还在加班");
}
这样看起来业务逻辑是不是更清晰了呢,可能你又会觉得,少了几行代码,多了一个文件是不是不大划算,那你可以改一下@Pointcut("execution (* *.work(..))")
的监控范围,让它能看的更多一些。