初窥AOP-面向切面编程

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(..))")的监控范围,让它能看的更多一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值