文档章节

Spring整合AspectJ的AOP编程

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

工作需要,之前的项目上线后,基本是靠运维发现运行中的异常。新的项目启动一段时间了,不想单纯的靠运维人工发现程序运行中的异常,想利用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
粉丝 0
博文 8
码字总数 2059
作品 0
海淀
程序员
2014-03-11 Spring的学习(3)------面向切面编程(AOP)

AOP概念 首先让我们从一些重要的AOP概念和术语开始。这些术语不是Spring特有的。不过AOP术语并不是特别的直观,如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect):一个关注...

查封炉台
2014/03/11
0
0
Aspectj与Spring AOP比较

1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 是否与用户现有的或新的应用程序兼容? 在哪里可以实现 AOP? 与自己的应用程序集成多快? 性能开销是多少? 在本文中, 我们将...

沈渊
04/18
0
0
使用Spring进行面向切面编程(AOP)

转载于http://www.blogjava.net/supercrsky/articles/174368.html 文章太长,写的很好,没看完,转过来慢慢理解,品味 简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方...

zmf
2014/09/04
0
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

只想一个人静一静
2014/02/27
0
0
Spring中的AOP(一)——AspectJ的基本使用

AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充,当前已经成为一种比较成熟的编程思想,其实AOP问世的时间并不长,甚至在国内的翻译还不太统一(另有人...

摆渡者
2014/03/13
0
1

没有更多内容

加载失败,请刷新页面

加载更多

10-《深度拆解JVM》JVM是怎么实现invokedynamic的?(下)

一、问题引入 上回讲到,为了让所有的动物都能参加赛马,Java 7 引入了 invokedynamic 机制,允许调用任意类的“赛跑”方法。不过,我们并没有讲解 invokedynamic,而是深入地探讨了它所依赖...

飞鱼说编程
24分钟前
0
0
457. Circular Array Loop

Description Difficulty : Medium You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's n......

52iSilence7
39分钟前
1
0
MySQL SQL 常见用法

某字段重复记录 select a.fieldA from tableA a group by a.fieldA having count(a.fieldA)>1;==select * from (select a.fieldA, count(1) as faCount from tableA a group......

园领T
今天
1
0
如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则

以下是如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则。 防火墙 防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会...

linuxprobe16
今天
1
0
发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部