`
123003473
  • 浏览: 1060355 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

第一种配置方法:使用@AspectJ标签

 
阅读更多
第一种配置方法:使用@AspectJ标签

    在配置文件中添加<aop:aspectj-autoproxy/>注解
    创建一个Java文件,使用@Aspect注解修饰该类
    创建一个方法,使用@Before、@After、@Around等进行修饰,在注解中写上切入点的表达式

说明:上述Java文件创建好后,需要将其在Spring的容器中进行声明,可以在配置文件中定义<bean/>节点,也可以使用@Component组件进行修饰
示例:


 
  
    import org.aspectj.lang.ProceedingJoinPoint;  
    import org.aspectj.lang.annotation.After;  
    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.springframework.stereotype.Component;  
      
    /** 
     * 基于注解的AOP日志示例 
     * @author ZYWANG 2011-3-24 
     */  
    @Component  
    @Aspect  
    public class AopLog {  
          
        //方法执行前调用  
        @Before("execution (* com.zywang.services.impl.*.*(..))")  
        public void before() {  
            System.out.println("before");  
        }  
          
        //方法执行后调用  
        @After("execution (* com.zywang.services.impl.*.*(..))")  
        public void after() {  
            System.out.println("after");  
        }  
          
        //方法执行的前后调用  
        @Around("execution (* com.zywang.services.impl.*.*(..))")  
        public Object around(ProceedingJoinPoint point) throws Throwable{  
            System.out.println("begin around");  
            Object object = point.proceed();  
            System.out.println("end around");  
            return object;  
        }  
          
        //方法运行出现异常时调用  
        @AfterThrowing(pointcut = "execution (* com.zywang.services.impl.*.*(..))",throwing = "ex")  
        public void afterThrowing(Exception ex){  
            System.out.println("afterThrowing");  
            System.out.println(ex);  
        }  
    }  


上面这段代码中多次使用了重复的切入点,这种情况下,可以使用@Pointcut标注,来修改一个切入点方法(这个方法不需要参数和方法体),然后就可以在@Before等标注中引用该方法作为切入点,示例如下:


  
 import org.aspectj.lang.ProceedingJoinPoint;  
    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;  
      
    /** 
     * 基于注解的AOP日志示例 
     * @author ZYWANG 2011-3-24 
     */  
    @Component  
    @Aspect  
    public class AopLog {  
          
        @Pointcut("execution (* com.iflysse.school.services.impl.*.*(..))")  
        public void pointcut(){}  
          
        //方法执行前调用  
        @Before("pointcut()")  
        public void before() {  
            System.out.println("before");  
        }  
          
        //方法执行的前后调用  
        @Around("pointcut()")  
        public Object around(ProceedingJoinPoint point) throws Throwable{  
            System.out.println("begin around");  
            Object object = point.proceed();  
            System.out.println("end around");  
            return object;  
        }  
    }  




第二种配置方法:基于配置文件的配置

    创建一个Java文件,并指定一个用于执行拦截的方法,该方法可以有0个或多个参数
    在Spring配置文件中注册该Java类为一个Bean
    使用<aop:config/>、<aop:aspect/>等标签进行配置

  
 import org.aspectj.lang.ProceedingJoinPoint;
      
    /** 
     * 基于配置文件的AOP日志示例 
     * @author ZYWANG 2011-3-24 
     */  
    public class AopLog {  
          
        //方法执行的前后调用  
        public Object runOnAround(ProceedingJoinPoint point) throws Throwable{  
            System.out.println("begin around");  
            Object object = point.proceed();  
            System.out.println("end around");  
            return object;  
        }  
          
    }  


Spring配置文件

<bean id="aopLog" class="com.iflysse.school.aop.AopLog"></bean>  
  
<aop:config>  
    <aop:aspect ref="aopLog">  
        <aop:around method="runOnAround" pointcut="execution (* com.zywang.services.impl.*.*(..))"/>  
    </aop:aspect>  
</aop:config> 


注意:上面这个示例使用的是around方式的拦截,该方法要求Java类中的方法有一个ProceedingJoinPoint类型的参数

使用第二种方式的AOP配置,在Eclipse(有SpringIDE插件)中被拦截到的方法中有标识显示



以上配置基于Spring 3.0.5 进行设置,参考其《Reference Documentation》

【转载地址】http://zywang.iteye.com/blog/974226
分享到:
评论

相关推荐

    Spring @AspectJ 实现AOP 入门例子

    @AspectJ是Spring支持的一种AOP实现,它使用注解来定义切面,简化了配置过程。 创建一个Spring AOP应用的第一步是设置项目结构。在给定的压缩包文件中,我们可能看到一个名为"src"的目录,通常这个目录包含项目的源...

    Manning.AspectJ.In.Action

    - **Manning.AspectJ.In.Action**:本书由Manning出版社出版,主要介绍AspectJ这一面向切面编程(AOP)语言和技术的应用实践。书名直译为“在行动中的AspectJ”,暗示了本书将通过实例和实战来探讨AspectJ的应用。 ...

    Spring实现AOP的四种方式

    **第一种:经典的基于代理的AOP** Spring提供`ProxyFactoryBean`来创建代理对象。你需要实现不同的Advice接口,然后在Spring配置文件中定义切点和通知。例如,你可以使用正则表达式或AspectJ表达式定义切点,并通过`...

    spring aop配置常用jar包

    2. **配置Spring容器**:在Spring的XML配置文件中启用AOP支持,通过`&lt;aop:config&gt;`标签开启,并可以定义切点(pointcut)和通知(advice)。 3. **定义切点**:使用`&lt;aop:pointcut&gt;`定义要拦截的方法或类。切点...

    Spring配置的5种方式

    - 类似于第一种方式,但不使用`TransactionProxyFactoryBean`,而是通过`aop:config`和`aop:pointcut`来定义切入点和通知。 - 示例配置可能会包含`&lt;aop:aspect&gt;`标签。 3. **基于注解的配置方式**: - 最为流行的...

    spring配置事物的5种方式

    ### 第一种:每个Bean都有一个代理 这种方式中,每个需要事务管理的Bean都会有一个对应的代理Bean。`TransactionProxyFactoryBean`用于创建事务代理,它需要设置`transactionManager`和要代理的目标Bean。以下是一...

    spring3 mvc jar

    1. ** annotations增强**:Spring 3大幅增强了对注解的支持,包括@Controller、@RequestMapping、@Service、@Repository等,使得配置文件大大简化,代码更易读。 2. ** RESTful支持**:通过@PathVariable、@Matrix...

    配置事务通知

    3. "ibatis集成spring 声明式事务管理_files" - 这个目录可能包含与第一个HTML文件相关的资源,如图片、样式表或JavaScript文件,帮助解释配置过程。 4. "jpetstore" - 这可能是Spring的示例应用程序JPetStore,它...

    spring-reference.pdf

    - **Lazily-instantiated beans**: 延迟加载Bean,直到第一次请求时才初始化。 - **Autowiring collaborators**: 自动装配协作对象,简化了配置。 - **Checking for dependencies**: 检查Bean是否存在未满足的依赖。...

    Spring中文帮助文档

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @...

    spring2.0framework.doc

    这种可扩展性使得第三方库能够提供与 Spring 配合使用的定制配置,降低了集成成本。 2.3. 面向切面编程(AOP)的提升 2.3.1. 更加简单的 AOP 配置 Spring 2.0 对 AOP 的支持得到了显著加强,简化了配置过程。使用 ...

    Spring API

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @...

    spring2.5 学习笔记

    #### 第一课:面向抽象编程 - **定义**:面向抽象编程是一种编程范式,强调通过抽象类或接口来设计程序结构,减少对具体实现的依赖。 - **优势**: - 提高了系统的可维护性与扩展性。 - 降低模块间的耦合度。 - **...

    Spring 2.0 开发参考手册

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...

    spring教学视频第三天

    1. **依赖注入(Dependency Injection, DI)**:这是Spring最核心的功能之一,通过DI,我们可以将对象之间的依赖关系解耦,提高代码的可测试性和可维护性。在视频中,可能会讲解如何使用@Autowired注解进行自动装配,...

    Spring5.1中文参考指南.pdf

    - **历史背景**:Spring项目始于2002年,由Rod Johnson创建,自2004年发布第一个版本以来,不断发展成为当今最受欢迎的企业级Java应用开发框架之一。 - **设计哲学**:强调轻量级、非侵入性以及对POJO的支持,通过...

    spring chm文档

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ...

    Struts Tutorial

    - **AspectJ简介**:AspectJ是一种面向切面编程(AOP)的扩展语言,用于处理横切关注点。 - **使用AspectJ的优点**: - 可以更清晰地管理横切关注点 - 提高代码的可维护性和可读性 - **实现步骤**: - 安装...

Global site tag (gtag.js) - Google Analytics