spring aop编程

1、AOP,面向切面编程(aspect Oriental programing),使用aop,可以将处理切面aspect的代码注入到主程序,通常主程序的主要目的不是处理这些切面aspect,可以防止代码混乱。拦截机 interceptor是AOP的另一中叫法。(其中使用的模式为代理模式,动态代理模式)。

2、通知advise:在aspect的某个连接点(在Spring的aop中,一个连接点就是一个方法的执行)上执行的动作。

切入点pointcut:匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。

目标对象:target object,被一个活多个切面所通知的对象。也称被通知对象。

3、spring中的aop

加入支持aop的jar包:

aopalliance.jar

aspectjrt.jar

aspectjweaver.jar

spring-aop.jar

spring-aspect.jar

(1)在xml中加入aop的命名空间:

<?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"

     xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd

     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>

(2)写aspect类和切面的通知

<bean id="myAspect" class="com.spring1.util.Aspect"/>
    <aop:config>
        <!--切面 -->
        <aop:aspect ref="myAspect">
            <!-- 切入点 执行(方法访问修饰符? 方法返回类型   声明类? 方法名(方法参数类型) 抛出异常?) -->
            <aop:pointcut expression="execution(* com.spring1.dao..*.*(..))" id="point1"/>
            <aop:before method="beforeAdvise" pointcut-ref="point1"/>
            <aop:after method="afterAdvise" pointcut-ref="point1"/>
            <!-- 返回通知,最后的参数是通知参数的名 -->
            <aop:after-returning method="afterReturning" pointcut-ref="point1" returning="ret"/>
            <!-- 异常通知,最后参数是异常的参数的名 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="point1" throwing="e"/>
        </aop:aspect>
    </aop:config>

(3)将aspect类交给Spring管理,配置aspect类的bean

上边已配置过

(4)根据aop中的通知写通知函数:

//切面类
public class Aspect {
    //通知...
    void beforeAdvise(){
        System.out.println("before");
    }

    void afterAdvise(){
        System.out.println("after");
    }

    void afterReturning(Object ret){
        System.out.println("afterReturning " +ret.toString());
    }

    void afterThrowing(Exception e){
        System.out.println("afterThrowing " + e.getMessage());
    }
}

(5)当上边的都需要些的时候可以直接用 环绕通知代替:

<bean id="myAspect" class="com.spring1.util.Aspect"/>
    <aop:config>
        <!--切面 -->
        <aop:aspect ref="myAspect">
            <!-- 切入点 执行(方法访问修饰符? 方法返回类型   声明类? 方法名(方法参数类型) 抛出异常?) -->
            <aop:pointcut expression="execution(* com.spring1.dao..*.*(..))" id="point1"/>
            <aop:around pointcut-ref="point1" method="aroundAdvise"/>
        </aop:aspect>
    </aop:config>
    void aroundAdvise(ProceedingJoinPoint pjp){
        try {
            System.out.println("前置");
            Object object = pjp.proceed();
            System.out.println(object.toString());
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常");
        }finally{
            System.out.println("最终");
        }
    }

后置通知就是返回后的通知

最终通知又叫finally通知。

时间: 2024-08-24 02:31:48

spring aop编程的相关文章

(转)Spring AOP编程原理、Demo

转自: http://pandonix.iteye.com/blog/336873/ Spring AOP 详解 此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 对部分函数的调用进行日志记录

spring AOP 编程--AspectJ注解方式 (4)

1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充. AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点. 在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里. AOP 的好处:

Spring Aop编程的demo

1: 新建一个普通的bean :Role 属性 Id,name,添加无参构造,setter getter方法 2:新建一个接口:RoleService,随便写一个方法printRole 3:新建一个类RoleServiceImpl,实现RoleService接口,重写printRole方法 注意 @Component 注解别忘了 4:定义切面类 RoleAspect 添加四个通知方法 注意: 添加@Aspect注解 execution中的参数一定要写对,例:"execution(* aop.se

Spring AOP编程实例

整个类包如下: 一.具体各个类 1.1前置通知类 package com.yuan.aop; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class MymethodBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] ar

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

Spring AOP 实现原理(二) 使用 Spring AOP

与 AspectJ 相同的是,Spring AOP 同样需要对目标类进行增强,也就是生成新的 AOP 代理类:与 AspectJ 不同的是,Spring AOP 无需使用任何特殊 命令对 Java 源代码进行编译,它采用运行时动态地.在内存中临时生成"代理类"的方式来生成 AOP 代理. Spring 允许使用 AspectJ Annotation 用于定义方面(Aspect).切入点(Pointcut)和增强处理(Advice),Spring 框架则可识别并根据这些 Annotati

Spring AOP的理解

这是在网上发现的一篇关于Spring AOP编程的教程,读完这篇文章后,Spring AOP不再难以理解,因此我把它译成中文,推荐给Spring AOP的初学者. AOP正在成为软件开发的下一个圣杯.使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect.AOP可以防止代码混乱.  为了理解AOP如何做到这点,考虑一下记日志的工作.日志本身不太可能是你开发的主程序的主要任务.如果能将“不可见的”.通用的日志代码注入主程序中,那该多好啊.AOP可以帮

Java的面向AOP编程

一. 引言 AOP(Aspect-Oriented Programming,面向切面的编程),是一种新型的编程范式,主张关注软件流程中的一个切面,将同样功能的代码整合打包在一起,降低系统的耦合性,增强其扩展性. 传统的软件设计,往往采取事件驱动模型带来类似的效果,通过在可能的事件切入点插入事件回调函数,将对应位置插入外置代码. 函数式编程,也有类似的解决方案,通过函数传递,将对应位置的扩展上新的功能. Java作为一门严谨的传统式开发语言,以安全性和可靠性为第一标准,语言并没有过多的新特性支持,

Spring AOP 实现原理与 CGLIB 应用--转

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强:而动态代理则在运行时借助于 JDK 动态代理.CGLIB 等在内存中“临时”生成 AOP 动态代理