AOP简介:完善OOP,模块化横切关注点及声明式事务管理

网安智编 厦门萤点网络科技 2025-07-18 00:04 91 0
AOP简介 AOP简介 AOP概念 + * 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解成各个方面 或者说关注点 。 这使得可...

Spring AOP 事务管理_spring aop 实现_AOP Spring Hibernate 面向方面编程

AOP简介 AOP简介 AOP概念 + * 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解成各个方面 或者说关注点 。 这使得可以模块化诸如事务管理等这些横切多个对象的关注点。(这些关注点术语称作 横切关注点。 * 提供声明式企业服务,特别是作为EJB声明式服务的替代品。这些服务中最重要的是 声明式事务管理,这个服务建立在的事务管理抽象之上 允许用户实现自定义的方面,用AOP完善他们的OOP的使用 * 方面(): 一个关注点的模块化,这个关注点实现可能 另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用的 或拦截器实现 连接点(): 程序执行过程中明确的点,如方法的调 用或特定的异常被抛出。 通知(): 在特定的连接点,AOP框架执行的动作。各种类 型的通知包括“”、“”和“”通知。通知类型将在下面讨论。许多AOP框架 包括都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器 链* 切入点(): 指定一个通知将被引发的一系列连接点 的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式 引入(): 添加方法或字段到被通知的类。 允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 接口,来简化缓存 目标对象( ): 包含连接点的对象。也被称作 被通知或被代理对象 AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在中,AOP代理可以是JDK动态代理或者CGLIB代理 * 织入(): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用编译器),也可以在运行时完成。和其他纯Java AOP框架一样, 在运行时完成织入。各种通知类型包括 通知: 包围一个连接点的通知,如方法调用。这是最 强大的通知。Aroud通知在方法调用前后完成自定义的行为。它们负责选择继续执行连接点或通过 返回它们自己的返回值或抛出异常来短路执行 通知: 在一个连接点之前执行的通知,但这个通知 不能阻止连接点前的执行(除非它抛出一个异常 通知: 在方法抛出异常时执行的通知。提供 强类型的通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从 或强制类型转换 After 通知: 在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常 * 一般利用正则表达式来实现切入点 bean id= class=org..aop.. name= list value.*get.*/value value.*/value /list / /bean * 通知 通知 通知 After 通知 * 通知是一种简单的通知类型 在进入一个方法之前被调用 要实现 接口中的方法 通知可以被用于任何类型的切入点 * class { void ( m, args, ) {} } * 在进入方法前要处理的业务逻辑 在方法执行之后调用 必须实现中的 方法 ( , m, args, ) 返回值(不能改变)、被调用的方法、方法的参数和 目标对象 * class vice { void ( , m, args, ) { } } * 加入方法执行后要处理的业务逻辑 中最基本的通知类型是 使用方法拦截器的通知是和AOP联盟接口兼容的* 实现通知的 类需要实现接口 class { ( ) { rval = ceed(); rval; } } * 方法执行前要处理的业务逻辑 方法执行后要处理业务逻辑 ,引入一个间接的层次 如果你 定义一个名字为foo的, 引用foo的对象所看到的不是 实例本身,而是由实现的类的 ()方法所创建的对象。这个方法将创建一个包装了目标对象 的AOP代理 使用最重要的优点之一是IoC可以管理通知和切入点 * : 如果我们应该代理目标类, 而不是接口,这个属性的值为true。如果这是true,我们需要使用CGLIB。 : 是否使用强优化来创建代理。不要使用 这个设置,除非你了解相关的AOP代理是如何处理优化的。目前这只对CGLIB代理有效;对JDK 动态代理无效(默认)。 : 是否禁止通知的改变,一旦代理工厂已经配置。 默认是false。 : 当前代理是否要暴露在中, 以便它可以被目标对象访问。(它可以通过得到,不需要)。 如果一个目标需要获得它的代理并且的值是ture,可以使用 .()方法。 * : 所使用的具体实现。 这个参数提供了一条途径来定义是否使用动态代理、CGLIB还是其他代理策略。默认实现将适当地选择动态 代理或CGLIB。一般不需要使用这个属性;它的意图是允许 1.1使用另外新的代理类型。 其他特定的属性包括: : 接口名称的字符串数组。如果这个 没有提供,CGLIB代理将被用于目标类。 : 、或其他 被应用的通知名称的字符串数组。顺序是很重要的。这里的名称是当前工厂中bean的名称,包 括来自祖先工厂的bean的名称。 : 工厂是否返回一个单独的对象,无论 ()被调用多少次。许多 的实现提供这个方法。默认值是true。如果你想要使用有状态的通知--例如,用于有状态的 mixin--将这个值设为false,使用通知。 * bean id= class=mons.dbcp. name= ..jdbc../value / name=url ::://:1433;=pubs/value / name= /value / name= /value / /bean * bean id= class= org..orm..ean name= ref bean= / / name= props prop key=. org.../prop /props / name= list ///form/.hbm.xml/value /list / /bean * bean id= class=com...bean. name= ref bean= / / /bean * class { void save( ) { try {().(); } catch ( re) { throw re;} } *