`
zhuchengzzcc
  • 浏览: 442622 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring aspectj小试

阅读更多
package aspect1;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author zhuc
 *
 */
@Aspect
@Component
public class Aspect1 {
    
    public Aspect1(){
        System.out.println("Aspect1()   构造器");
    }

//    @Pointcut(value = "execution(* add*(..)) || execution(* del*(..))")
    @Pointcut(value = "execution(* aspect1..*(..))") // 参数(..)可以写完整的package名+类名
//    @Pointcut(value = "within(aspect1..*)")
//    @Pointcut(value = "within(aspect1.Service2Impl)")   //匹配目标类Service1Impl(包名可以省略)的所有方法
//    @Pointcut(value = "args(String)")
    private void pointCut() {

    }

    @Before(value = "pointCut()")
    public void doBefore() {
        System.out.println("doBefore......");
    }

    @After(value = "pointCut()")
    public void doAfter() {
        System.out.println("doAfter......");
    }

    /**
     * AfterReturning 增强处理处理只有在目标方法成功完成后才会被织入。<br>
     * After 增强处理不管目标方法如何结束(保存成功完成和遇到异常中止两种情况),它都会被织入。<br>
     * @param obj
     */
    @AfterReturning(value = "pointCut()", returning = "obj")
    public void doAfterReturning(Object obj) {
        System.out.println("返回的值是:" + obj);
        System.out.println("doAfterReturning+Obj......");
    }

    /**
     * Around 增强处理近似等于 Before 增强处理和 AfterReturning 增强处理的总和<br>
     * 它可改变执行目标方法的参数值,也可改变目标方法之后的返回值<br>
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around(value = "pointCut()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before doAround......");
        Object obj = pjp.proceed();
        System.out.println("doAround......");
        System.out.println("after doAround......");
        return obj;
    }

    /**
     * @param ex
     */
    @AfterThrowing(value = "pointCut()", throwing = "ex")
    public void doAfterThrowing(Throwable ex) {
        System.out.println("抛出的异常是:" + ex);
        System.out.println("doAfterThrowing......");
    }

}

  

 

关于PointCut中execution表达式规范,请参考 http://zhuchengzzcc.iteye.com/blog/1504014

 

 

package aspect1;

/**
 * @author zhuc
 *
 */
public interface Service1 {

    public void addDomain();

    public void delDomain() throws Exception;

    public String modifyDomain(String name);
}
package aspect1;

public interface Service2 {
    public void buy();
}

 

package aspect1;

/**
 * @author zhuc
 *
 */
public class Service1Impl implements Service1 {

    @Override
    public void addDomain() {
        System.out.println("Service1 添加");
    }

    @Override
    public String modifyDomain(String name) {
        System.out.println("Service1 修改" + name);
        return name;
    }

    @Override
    public void delDomain() throws Exception {
        System.out.println("Service1 删除");
        int i = 1 / 0;
    }

}

 

 

package aspect1;

public class Service2Impl implements Service2{

    @Override
    public void buy() {
        System.out.println("Service2 买");
    }

}

 

 

 aspect1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	
	<context:component-scan base-package="aspect1" />
	<aop:aspectj-autoproxy />
	
	<bean id="service1" class="aspect1.Service1Impl" />
	<bean id="service2" class="aspect1.Service2Impl" />

</beans>

  

 测试方法:

package aspect1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhuc
 *
 */
public class Test1 {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext(
                "aspect1/aspect1.xml");
        Service1 s = (Service1) ac.getBean("service1");
        s.addDomain();
        System.out.println();
        s.modifyDomain("哈哈");
        System.out.println();
        try {
            s.delDomain();
        } catch (Exception e) {
        }
        System.out.println();
        
        Service2 s2 = (Service2) ac.getBean("service2");
        s2.buy();
    }

}

 

 

 

运行结果如下:

Aspect1()   构造器
doBefore......
before doAround......
Service1 添加
doAfter......
返回的值是:null
doAfterReturning+Obj......
doAround......
after doAround......

 

doBefore......
before doAround......
Service1 修改哈哈
doAfter......
返回的值是:哈哈
doAfterReturning+Obj......
doAround......
after doAround......

 

doBefore......
before doAround......
Service1 删除
doAfter......
抛出的异常是:java.lang.ArithmeticException: / by zero
doAfterThrowing......

 

 

doBefore......
before doAround......
Service2 买
doAfter......
返回的值是:null
doAfterReturning+Obj......
doAround......
after doAround......

分享到:
评论

相关推荐

    spring aspectj.jar

    《Spring AOP与AspectJ深度解析》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的面向切面编程(AOP)特性极大地简化了代码的维护和扩展。AspectJ是Spring AOP的重要组成部分,...

    Spring AspectJ的学习一

    **Spring AspectJ 学习详解** 在Java世界中,Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力而闻名。AspectJ是AOP领域的一个强大工具,它扩展了Java语言,允许开发者创建所谓的"切面",来封装横切...

    spring基于AspectJ实现事务控制

    在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...

    Spring 使用AspectJ 实现 AOP之前置通知小例子

    标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...

    spring AspectJ aop学习

    当我们谈论"spring AspectJ aop学习"时,我们将深入探讨Spring AOP如何结合AspectJ来实现更灵活的模块化和解耦。 首先,让我们理解AOP的概念。面向切面编程(Aspect Oriented Programming)是一种编程范式,旨在将...

    Spring AOP @AspectJ 入门实例

    本实例将带你深入理解并实践Spring AOP与@AspectJ的结合使用。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,即跨越多个对象的行为或责任。这些切面可以包含业务逻辑、日志、...

    Spring的AOP依赖包-AspectJ

    而AspectJ是Java平台上的一个开源项目,提供了一种强大的、类型安全的AOP解决方案,它能够与Spring框架完美结合,增强Spring的AOP功能。 首先,我们需要理解AOP的核心概念。切面(Aspect)是关注点的模块化,这些...

    spring aspectj-1.9.0.jar包

    aspectj.jar的1.9.0版本,下载后粘贴到所属的lib文件下即可

    spring和aspectj的aop实验

    标题"spring和aspectj的aop实验"表明我们将探讨如何在Spring中使用AspectJ进行AOP实践。这通常涉及到创建切面、定义通知、配置织入策略以及测试其效果。 1. **什么是AOP** AOP的核心概念是切面(Aspect),它封装...

    Spring AOP的AspectJ支持jar包

    Spring AOP的AspectJ支持jar包; 包括: com.springsource.net.sf.cglib-2.2.0.jar com.srpingsource.org.aopalliance-1.0.0.jar com.srpingsource.org.aspectj.weaver-1.68.RELEASE.jar

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...

    aspectj的jar spring使用aop需要的jar

    综上所述,为了在Spring中利用AspectJ的全部功能,你需要将对应的AspectJ JAR文件加入到项目类路径中,然后按照Spring文档或AspectJ文档的指导配置和使用AOP。这将使你的代码更加模块化,降低耦合,提高可维护性。

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    spring源码导入所需aspectj包

    在Spring框架中,AspectJ是一种强大的面向切面编程(AOP)工具,它允许开发者定义“切面”——即跨越多个对象的行为或属性。这些切面可以用来封装那些分散在整个应用中的横切关注点,例如日志、事务管理或者安全控制...

    Spring AspectJ AOP框架注解原理解析

    Spring AspectJ AOP框架注解是Spring框架中实现面向切面编程(AOP)的一种方式,它结合了AspectJ的强大功能和Spring的易用性。AspectJ是一个独立的AOP框架,它为Java提供了专门的语法和编译器来处理切面。Spring 2.0...

    Spring @AspectJ 实现AOP 入门例子

    本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...

    Spring AOP AspectJ使用及配置过程解析

    Spring AOP AspectJ 使用及配置过程解析 本文主要介绍了 Spring AOP AspectJ 的使用及配置过程解析,通过示例代码介绍了非常详细,对大家的学习或者工作具有一定的参考学习价值。 AspectJ 简介 AspectJ 是一个...

    Spring2.5使用AOP需要的aspectJ

    AspectJ是一个成熟的AOP框架,Spring在其AOP实现中整合了AspectJ,提供了更强大的面向切面编程能力。本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1....

    jar包---Spring Aop AspectJ新增包.rar

    在"jar包---Spring Aop AspectJ新增包.rar"这个压缩文件中,我们可以预见到它包含了用于支持Spring AOP和AspectJ功能的必要库文件。 Spring AOP的实现主要有两种方式:一种是基于代理的AOP(Proxy-based AOP),另...

    详解在Spring中如何使用AspectJ来实现AOP

    使用AspectJ实现AOP在Spring中的详解 标题:详解在Spring中如何使用AspectJ来实现AOP 描述:使用AspectJ来实现AOP(Aspect-Oriented Programming)在Spring框架中,通过AspectJ来描述切点和增强,实现AOP编程。 ...

Global site tag (gtag.js) - Google Analytics