文档章节

Spring整合AspectJ的AOP编程

tryme
 tryme
发布于 2017/08/30 01:16
字数 713
阅读 60
收藏 0

精选30+云产品,助力企业轻松上云!>>>

工作需要,之前的项目上线后,基本是靠运维发现运行中的异常。新的项目启动一段时间了,不想单纯的靠运维人工发现程序运行中的异常,想利用spring的aop编程来完善一套开发的异常自动捕获。

  1. 首先创建一个maven项目,配置pom文件,引入相关依赖jar包
    <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <!-- Spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>3.2.4.RELEASE</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
  2. 创建目标target
     

    import net.okdi.core.service.PromoService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class PromoServiceImpl implements PromoService {
        public String insertRecord(String memberId) {
            System.out.println("开始添加记录。。。");
            int i = 1 / 0;  // 故意写出异常
            System.out.println("添加记录完毕。。。");
            return null;
        }
    }

    即需要增强的类

  3. 创建通知(即增强类 advice)
     

    package net.okdi.core.exception;
    
    import org.aspectj.lang.JoinPoint;
    
    /**
     * 异常通知增强
     */
    public class ExceptionHelper {
    
        public void afterThrow(JoinPoint jp, Throwable ex) {
            System.out.println("************************");
            // 程序运行抛出异常后的业务处理...
            System.out.println("正常业务处理");
            System.out.println(ex.getMessage());
            System.out.println("************************");
        }
    }
    

    在 aspectj 框架中它的增强可以不实现任何接口,只需要定义出增强功能(方法)。两个参数JoinPoint和Exception。JoinPoint是切点,它的getArgs()方法可以获取传入的参数;getSignature()方法返回一个Signature对象,这个对象的getDeclaringTypeName()方法可以获取异常发生的类的全路径,getName()方法可以获取抛出异常的方法。

  4. 在spring的xml配置文件中配置(或者使用@AfterThrowing注解配置)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!-- 注解扫描包 -->
        <context:component-scan base-package="net.okdi"/>
    
        <!-- 配置目标 -->
        <bean id="promoService" class="net.okdi.core.service.impl.PromoServiceImpl"/>
    
        <!-- 配置通知 -->
        <bean id="exceptionAdvice" class="net.okdi.core.exception.ExceptionHelper"/>
    
        <!-- aop:config声明,aop:aspect配置切面 proxy-target-class默认false(有接口jdk动态代理,无接口cglib动态代理)true强制cglib代理 -->
        <aop:config proxy-target-class="true">
            <aop:aspect ref="exceptionAdvice">
                <aop:after-throwing method="afterThrow" pointcut="execution(* net.okdi.core..*(..))" throwing="ex"/>
            </aop:aspect>
        </aop:config>
    
    </beans>
    

    proxy-target-class默认false(有接口jdk动态代理,无接口cglib动态代理)修改为true强制使用cglib动态代理

  5. 编写测试类进行测试
     

    import net.okdi.core.service.PromoService;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    public class Test {
    
        @Autowired
        private PromoService promoService;
        
        @org.junit.Test
        public void test() {
            promoService.insertRecord("");
        }
    }
    

     

  6. 测试结果

至此,利用Spring整合AspectJ框架进行AOP编程中的异常通知开发完毕!

tryme
粉丝 2
博文 8
码字总数 2059
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
spring中AspectJ的使用

[TOC] AspectJ: 什么是AOP: AOP为Aspect Oriented Programming,意为:面向切面编程;它是一种思想一种设计典范(同Ioc);它是OOP(面向对象编程)的一种衍生。通过AOP对业务逻辑进行隔离,...

osc_vnse1t2o
2019/11/13
5
0
Spring AOP源码分析(一)AOP介绍和aspectj、SpringAOP入门

首先说说三个名词,面向对象、面向接口编程、面向切面编程(Aspect Oriented Programming 即AOP)。 针对java来说 面向对象:是对现实世界的描述,是后两者的基础,大前提。 面向接口编程:接...

乒乓狂魔
2015/02/07
1K
0
<aop:aspectj-autoproxy />作用

通过配置织入@Aspectj切面 虽然可以通过编程的方式织入切面,但是一般情况下,我们还是使用spring的配置自动完成创建代理织入切面的工作。 通过aop命名空间的<aop:aspectj-autoproxy />声明自...

osc_xign2agv
2018/11/21
11
0
Spring AOP源码分析(一)AOP介绍和aspectj、SpringAOP入门

首先说说三个名词,面向对象、面向接口编程、面向切面编程(Aspect Oriented Programming 即AOP)。 针对java来说 面向对象:是对现实世界的描述,是后两者的基础,大前提。 面向接口编程:接...

Sheamus
2015/03/30
142
0
Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现。 本文一下未贴出的相关代码示例请关注小编的上篇博文《Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较》,...

osc_lx0fj820
2018/03/01
8
0

没有更多内容

加载失败,请刷新页面

加载更多

在Python中从字符串转换为布尔值? - Converting from a string to boolean in Python?

问题: Does anyone know how to do convert from a string to a boolean in Python? 有谁知道如何在Python中从字符串转换为布尔值? I found this link . 我找到了此链接 。 But it doesn't......

javail
51分钟前
19
0
中国饭店协会数据表明

记者了解到,中国饭店协会数据表明,2018年全国餐饮收入42716亿元,同比增长9.5%.根据国家统计局数据显示,截至2017年底,限额以上餐饮行业的从业人数达到2232万人,巨大的餐饮市场背后,餐饮行业的...

asd369
今天
35
0
OSChina 周六乱弹 —— 日本的丧尸光天化日之下都开始……

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《風の手枕》- 増田俊郎 手机党少年们想听歌,请使劲儿戳(这里) @码界农民工 :...

小小编辑
今天
43
0
Hacker News 简讯 2020-07-11

更新时间: 2020-07-11 03:01 The TikTok app is no longer permitted on mobile devices that access Amazon email - (twitter.com) TikTok应用程序不再允许在访问亚马逊电子邮件的移动设备上......

FalconChen
今天
161
0
是否有可能从另一个git存储库中挑选一个提交? - Is it possible to cherry-pick a commit from another git repository?

问题: I'm working with a git repository that needs a commit from another git repository that knows nothing of the first. 我正在使用一个git存储库,需要从另一个不知道第一个存储库......

技术盛宴
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部