专栏首页java工会一个简单的例子实现自己的AOP

一个简单的例子实现自己的AOP

AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。

从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。

AOP 作用:

1 监控函数的调用

2 捕获异常发生

实际应用在:事务、安全、日志等横切关注。

下面是aop打印service层的方法日志为例:

/**
 * @功能描述: Service层日志/异常切面类
 */
@Component
@Aspect
public class ApiServiceAspect {

    private final Logger logger = Logger.getLogger(this.getClass());

    /**
     * 切面
     */
    private final String POINT_CUT = 
        "execution(* com.demo.bigdata.service.*.*.*(..))";

    @Pointcut(POINT_CUT)
    private void pointcut(){}

    @Before(value = POINT_CUT)
    public void before(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        StringBuilder log = new StringBuilder();
        log.append("before: ")
                .append(className)
                .append("@")
                .append(methodName)
                .append(" , params: ");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            log.append(JSONObject.toJSONString(arg) + ", ");
        }
        logger.info(log.toString());
    }

    @AfterReturning(value = "pointcut()", returning = "returnObj")
    public void afterReturn(Object returnObj) {
        String result = JSONObject.toJSONString(returnObj);
        logger.info("afterReturning: "+result);
    }

    @AfterThrowing(value = POINT_CUT, throwing = "e")
    public void afterThrowing(Throwable e) {
        logger.error("afterThrowing: "+e.getMessage(), e);
    }

    @Around(value = "pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) 
        throws Throwable {
        Long begin = System.currentTimeMillis();
        StringBuilder log = new StringBuilder("around: ");
        Object result = null;
        try {
            result = proceedingJoinPoint.proceed();
        } catch (Exception e) {
            logger.error(log + e.getMessage(), e);
        }
        Long end = System.currentTimeMillis();
        log.append(" 执行时间: ")
                .append(end-begin)
                .append("ms");
        return result;
    }

} 

配置文件使其生效

<context:component-scan base-package="com.demo.bigdata" />

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

如果使用了spring mvc后,如果把<aop:aspectj-autoproxy proxy-target-class="true"/>放在application.xml文件中可能会aop无效,最好把它放在dispatcher-servlet.xml文件中。

本文分享自微信公众号 - java工会(javagonghui),作者:java工会

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 详解java中的四种代码块

    使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。

    三哥
  • Go语言能够取代Java,成为下一个王者吗?

    近几年来,Go语言真是越来越火了。我也做过几个Go语言的项目了,我们公司很多微服务的项目也在由Java往Go上面转了。我们来看看Tiobe世界编程语言排行的最新...

    三哥
  • 6 大主流 Web 框架优缺点对比

    是该读些评论和做一些总结的时候了。当我们开始写这个系列博客的时候,我们知道 JavaScript/web 应用框架并不太好总结。我们努力对这个不可回答的问题作出...

    三哥
  • springboot添加邮件发送及压缩功能

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190233.html

    上帝
  • CRM市场还能红多久?2017还有哪些数据你不知道

    前几年受移动互联网的影响,一批新兴的云CRM成为了资本市场上的宠儿,包括纷享销客、红圈营销、小满科技、腾腾科技、麦客、美洽、销售易、快消总管、EC营客通、销帮帮...

    人称T客
  • 大数据投融资周报(12月22日——1月03日,共10起)

    【数据猿导读】 近期大数据领域共发生10起投融资事件,全部为中国企业,涵盖医疗/健康、金融、教育、人工智能、互娱、零售等多个领域,总融资额超过2.6亿人民币,以...

    数据猿
  • ODL Lithium SR2版本Entity Ownership Service分析及OFplugin规模部署可用预测

    家好,我是盛科网络负责sdn研发的张东亚,作为sdn设备的提供商,业余非常关注sdn生态圈的发展,最近抽时间研究了li版本of plugin的代码,记录了一些心...

    SDNLAB
  • PowerBI 发布2019年路线图

    PowerBI 的发展规划一直令人关注,今日,微软官方发布了PowerBI 2019年的路线图。本文挑选其中几个重点分享,详细信息请参考官方文档: 【Power...

    BI佐罗
  • 浅析CRM软件服务市场的现状

    受到新冠疫情影响,云办公风潮四起,大大小小的科技公司都想在SaaS办公上分一杯羹,今年以来,CRM百花齐放,可选择的品牌和工具骤然多了起来,但万变不离其宗后,C...

    All in
  • 谷歌新系统UI曝光,这是要把安卓大哥拉下马的节奏?

    镁客网

扫码关注云+社区

领取腾讯云代金券