理解Spring AOP

来源:互联网 发布:怎样注册.com域名? 编辑:程序博客网 时间:2024/04/30 19:01

什么是AOP

       OOP(Object-Oriented Programing,面向对象编程)通过其特性封装、继承和多态性使得对象在层次结构中抱有优势,然而面临为各个队形添加公共行为的时候,表现的捉襟见肘。AOP(Aspect-OrientedProgramming,面向方面编程)刚好是为OOP在这一块做了补充。
       AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

AOP使用场景

Authentication 权限
Error handling 错误处理
logging记录跟踪
Transactions 事务

AOP相关概念

1.通知(Advice):
通知定义了切面是什么以及何时使用。
2.连接点(Joinpoint):
程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
3.切入点(Pointcut)
通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称
4.切面(Aspect)
通知和切入点共同组成了切面:时间、地点和要发生的“故事”
AOP配置使用
<aop:config>  
        <aop:aspect id="TestAspect" ref="aspectBean">  
            <aop:pointcut id="businessService"  
                expression="execution(* com.xdy.app.service..*.*(..))" />  
            <aop:before pointcut-ref="businessService" method="doBefore"/>  
            <aop:after pointcut-ref="businessService" method="doAfter"/>  
            <aop:around pointcut-ref="businessService" method="doAround"/>  
            <aop:after-throwing pointcut-ref="businessService" method="doThrowing" throwing="ex"/>  
        </aop:aspect>  
    </aop:config> 

AOP切面
public class AspectHandler {
    private final static Logger LOG=LoggerFactory.getLogger(AspectHandler.class);

    public void doBefore(JoinPoint jp) {
        LOG.info("\ncalled for method: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    }

    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long time = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        time = System.currentTimeMillis() - time;
        LOG.info("\nprocess time: " + time + " ms");
        return retVal;
    }

    public void doThrowing(JoinPoint jp, Throwable ex) {
        LOG.info("\nI am doThrowing ,throw exception,details:" + ex.getMessage() );
    }

    public void doAfter(JoinPoint jp) {
        LOG.info("\nend method:" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    }
}
数据响应
2017-02-23 14:17:28,875  INFO [http-bio-80-exec-6] c.x.a.a.h.AspectHandler:doBefore:27 -
called for method: com.xdy.app.service.ApiService.appKey
2017-02-23 14:17:30,880  INFO [http-bio-80-exec-6] c.x.a.a.h.AspectHandler:doAround:34 -
process time: 2005 ms
2017-02-23 14:17:30,880  INFO [http-bio-80-exec-6] c.x.a.a.h.AspectHandler:doAfter:43 -
end method:com.xdy.app.service.ApiService.appKey
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 比熊放阳台叫怎么办 海员入职体检不合格怎么办 联币金融立案投资人怎么办 联币金融的投资怎么办 养老保险领了几个月就挂了怎么办 高铁餐吧乘务员东西卖不出去怎么办 铁路局如果查出有乙肝怎么办 在火车站丢了东西怎么办 在新乡火车站丢了东西怎么办 自己的行李忘到高铁安检怎么办 高铁二等座睡觉怎么办 空少岁数大了怎么办 美国留学生办欧洲签证怎么办 苏州小区不让装充电桩怎么办 饿了么运力不足怎么办 书法落款写偏了怎么办 辐射4运行不流畅怎么办 vgs币忘了映射怎么办 货车把我的货物运输中损坏怎么办 道路货物运输从业资格证过期怎么办 高铁喷雾被扣了怎么办 宝宝不好好吸奶怎么办 宝宝不用劲吸奶怎么办 刚出生的宝宝不吃奶怎么办 老婆怀孕想吐怎么办呢 菜把下水道堵了怎么办 一楼厕所堵了怎么办 农村房屋确权有争议怎么办 盲审一个没过怎么办 本科生论文盲审不过怎么办 本科盲审没通过怎么办 一篇论文多次引用著作怎么办 学生毕业后改名学籍怎么办 大学毕业后改名字后学籍怎么办 考科目三下暴雨怎么办 挂科太多拿不到毕业证怎么办 挂科太多不给毕业证怎么办 大专毕业拿不到毕业证怎么办 高考差一分二本怎么办 3个月宝宝大小眼怎么办 华东交大理工学院没有评教怎么办