Spring AOP面向方面编程原理:AOP概念

AOP-面向切面编程——AspectJ AOP-面向切面编程 ——AspectJ sf2gis@163.com 2016年3月23日   1 目标:在不改变原有程序的前题下,增加新的功能。 能够为类、方法、jar包等增加新功能。 能够为自己的程序增加新功能。 2 原理:使用aspectj代替java重新编译和组织已有的基本功能类。 参考:Aspectj Cookbook中文版。 aspectj将代码中的aspectj 阅读详情

 AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IoC基础,是对OOP的有益补充。

AOP将应用系统分为两部分,核心业务逻辑Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP正在成为软件开发的下一个光环。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspectAOP可以防止代码混乱。

Spring framework是很有前途的AOP技术。作为一种非侵略性的、轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是像往常一样编程。

AOP概念

让我们从定义一些重要的AOP概念开始。

方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用SpringAdvisor或拦截器实现。

连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。

切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。

目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。

AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

各种通知类型包括:

  Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。

  Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

  Throws通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从ThrowableException强制类型转换。

  After returning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。

Around通知是最通用的通知类型。大部分基于拦截的AOP框架(如NanningJboss 4只提供Around通知。

如同AspectJSpring提供所有类型的通知,我们推荐你使用最为合适的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returning通知,而不是around通知,虽然around通知也能完成同样的事情。使用最合适的通知类型使编程模型变得简单,并能减少潜在错误。例如,你不需要调用在around通知中所需使用的MethodInvocationproceed()方法,因此就调用失败。

切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标。例如,提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了AOP的结构要素。

下面让我们实现一个Spring AOP的例子。在这个例子中,我们将实现一个before advice,这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码。

package com.ascenttech.springaop.test;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

public void before(Method m, Object[] args, Object target)

 throws Throwable {

  System.out.println("Hello world! (by "

    + this.getClass().getName()

    + ")");

 }

}

接口MethodBeforeAdvice只有一个方法before需要实现,它定义了advice的实现。before方法共用3个参数,它们提供了相当丰富的信息。参数Method madvice开始后执行的方法,方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时,参数args和被执行方法的名称都是非常有用的信息。你也可以改变传给m的参数,但要小心使用这个功能;编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。

在下面的BeanImpl类中,每个public方法调用前,都会执行advice,代码如下。

package com.ascenttech.springaop.test;

public class BeanImpl implements Bean {

 public void theMethod() {

  System.out.println(this.getClass().getName()

    + "." + new Exception().getStackTrace()[0].getMethodName()

    + "()"

    + " says HELLO!");

 }

}

BeanImpl实现了下面的接口Bean,代码如下。

package com.ascenttech.springaop.test;

public interface Bean {

 public void theMethod();

}

虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,Spring也鼓励这样做。

pointcutadvice通过配置文件来实现,因此,接下来你只需编写主方法的Java代码,代码如下。

package com.ascenttech.springaop.test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

 public static void main(String[] args) {

  //Read the configuration file

  ApplicationContext ctx

    = new FileSystemXmlApplicationContext("springconfig.xml");

  //Instantiate an object

  Bean x = (Bean) ctx.getBean("bean");

  //Execute the public method of the bean (the test)

  x.theMethod();

 }

}

我们从读入和处理配置文件开始,接下来马上要创建它。这个配置文件将作为粘合程序不同部分的“胶水”。读入和处理配置文件后,我们会得到一个创建工厂ctx,任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。

仅仅用配置文件便可把程序的每一部分组装起来,代码如下。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework. org/dtd/spring-beans.dtd">

<beans>

 <!--CONFIG-->

 <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">

 <property name="proxyInterfaces">

   <value>com.ascenttech.springaop.test.Bean</value>

  </property>

  <property name="target">

   <ref local="beanTarget"/>

  </property>

  <property name="interceptorNames">

   <list>

    <value>theAdvisor</value>

   </list>

  </property>

 </bean>

 <!--CLASS-->

 <bean id="beanTarget" class="com.ascenttech.springaop.test.BeanImpl"/>

 <!--ADVISOR-->

 <!--Note: An advisor assembles pointcut and advice-->

 <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethod PointcutAdvisor">

  <property name="advice">

   <ref local="theBeforeAdvice"/>

  </property>

  <property name="pattern">

   <value>com/.ascenttech/.springaop/.test/.Bean/.theMethod</value>

  </property>

 </bean>

 <!--ADVICE-->

 <bean id="theBeforeAdvice" class="com.ascenttech.springaop.test.TestBefore Advice"/>

</beans>

4bean定义的次序并不重要。我们现在有了一个advice、一个包含了正则表达式pointcutadvisor、一个主程序类和一个配置好的接口,通过工厂ctx,这个接口返回自己本身实现的一个引用。

BeanImplTestBeforeAdvice都是直接配置。我们用一个惟一的ID创建一个bean元素,并指定了一个实现类,这就是全部的工作。

advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的第一个属性来指定它所需的advice-bean,第二个属性则用正则表达式定义了pointcut,确保良好的性能和易读性。

最后配置的是bean,它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。beanProxyFactoryBean的一个实现,它是Spring framework的一部分。这个bean的行为通过以下的3个属性来定义。

属性proxyInterface定义了接口类。

属性target指向本地配置的一个bean,这个bean返回一个接口的实现。

属性interceptorNames是惟一允许定义一个值列表的属性,这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。

 

原文:http://book.csdn.net/bookfiles/111/1001113463.shtml

系统动力学仿真软件Vensim下载 Vensim是由美国Ventana Systems, Inc.所开发,是采用图示化编程的方式构建系统动力学模型,上手简单。Vensim有很多系列产品,其中Vensim PLE (Personal Learning Edition)是面向个人学习者的,完全免费,可直接官网下载,截止于2022/04/10,最新的Vensim PLE版本是9.2.3。 阅读详情

相关推荐

信息安全管理与评估赛题解析-单机取证(含环境)

链接:https://pan.baidu.com/s/1OMzIq884dW2vAiUp0k2Ppg。链接:https://pan.baidu.com/s/1i5daMqhD53wYeQ6hYzRK6Q。链接:https://pan.baidu.com/s/1QFAjdQZK4sJ-gGRP42XPKA。链接:https://pan.baidu.com/s/1BSXvqN2ZGCQXewgFULoeyQ。链接:https://pan.baidu.com/s/1g9zu5ngBz_KMjW1eBMkJAw。

Brucye 1813

AOP原理

AOP原理 什么是Aop AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面 AOP的作用 作用:在不修改源代码的情况下,可以实现功能的增强。 AOP的基本概念 切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。 连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或

qq_42477665的博客 5249

yolo26转换rknn模型相关资料

yolo26转换rknn模型相关资料

SpringAOP原理

为什么80%的码农都做不了架构师?>>> ...

weixin_33896069的博客 1444

Spring面向切面编程AOP

AOP,也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。AOP与OOP互相补充,面向对象编程将程序分解成各个层次的对象,而面向切面编程将程序的运行过程分解成各个切面。可以这么理解:面向对象编程是从静态角度考虑程序结构,而面向切面编程则是从动态角度考虑程序的运行过程。 AOP 就是在运行时通过动态代理技术对目标方法进行增强,可以在目标方法的调用前后或者调用过程中执行其他额外的逻辑。

燕双嘤 2724

Spring中的AOP原理

0 为什么需要AOP 现在有一个情景: 我们要把大象放进冰箱,步骤为:打开冰箱->放入大象->关闭冰箱 如果再把大象拿出来,步骤为:打开冰箱->拿出大象->关闭冰箱 代码如下: public void put() { System.out.println("打开冰箱..."); System.out.println("放入大象..."); System.out.println("关闭冰箱..."); } publi

weixin_44117767的博客 1786

第十四章、AOP编程实现原理

1.AOP概念 AOP (Aspect Oriented Programing) ⾯向切⾯编程 = Spring动态代理开发 以切⾯为基本单位的程序开发,通过切⾯间的彼此协同,相互调⽤,完成程序的构建 切⾯ = 切⼊点 + 额外功能 OOP (Object Oritened Programing) ⾯向对象编程 Java 以对象为基本单位的程序开发,通过对象间的彼此协同,相互调⽤,完成程序的构建 POP (Producer Oriented Programing) ⾯向过程(⽅法、函数)编程 C 以过程为基

豆恭梓的博客 669

Spring从入门到入土——AOP就这么简单

AOP 什么是AOP面向切面编程。通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型,利用AOP可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各个部分的耦合度降低,提高程序的可重用性,同时提高了开发效率。 AOPSpring中的作用 提供声明式事务;允许用户自定义切面 核心名词 横切关注点:横跨应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注

冢狐的私人空间 3523

Spring(三)AOP:面相切面编程详解

Spring系列: Spring(一)Spring的概述 Spring(二)IOC:Spring基于XML方式,注解方式两种方式 Spring(三)AOP:面相切面编程详解 Spring(四)spring的事务 1.AOP面向切面编程的相关概念 1.1.什么是AOPAOP (Aspect Oriented Programing) :面向切面编程,它是一种编程思想。 AOP采...

1377

Spring AOP 不再怕了!

AOP是Sping里的一大核心技术,也是面试中经常问到的问题 文章参考自百度 什么是AOPAOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务的逻辑无关 ,但是需要被业务模块所使用到的代码逻辑或责任 (如日志管理、权限控制、事务管理)封装起来,从而减少代码的冗余量,降低模块间的耦合度,有利于未来的可扩展性和可维护性 简单来说,AOP就是可以让你少写...

weixin_44233929的博客 500

Spring框架学习(五) 面向切面编程 AOP

1、 什么是AOP? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 经典应用:

qq_43170213的博客 261

谈谈Spring中的IOC和AOP概念

IOC和AOPSpring中的两个核心的概念,下面谈谈对这两个概念的理解。 --------------------------------------------------- 1. IOC(Inverse of Control):控制反转,也可以称为依赖倒置。     所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓倒置,

8万+

浅谈Spring概念(DI,IoC,AOP

  Spring重要的思想:IoC&amp;DI: 控制反转:将对象的创建权交给了spring 依赖注入:需要有IOC的环境,spring创建这个类的过程中,将这个类的依赖属性注入。就比如EE开发,有三层,分别是Action,Service,DAO。 action是管理,是总管,是分配任务的。 service是事务层,是进行逻辑操作的。 DAO是封装增删改查的。 那很明显,servi...

woshilishu的博客 4706

Spring学习笔记(四)—— Spring中的AOP

一、AOP概述   AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所...

VNOpU2015的专栏 208

Spring——Spring中的AOP简介、原理

Spring——AOP学习 一、什么是AOP AOP(Aspect Oriented Programming),面向切面编程AOP是OOP(Object Oriented Programming)面向对象编程的延续。 AOP是可以通过预编译方式和运行期动态代理的方式在不修改源代码的情况下给程序统一添加功能的一种技术。 AOP实际上是GoF(Gang of Four,GOF设计模式,四人组)的一种...

qq_43411550的博客 404

Spring Aop 精简版

1.切面术语 Aspect【切面】:横切多个类的关注点的模块化。事务管理是企业Java应用程序中横切关注点的一个很好的例子。在Spring AOP中,切面是通过使用标准类(基于schema的风格)或使用@Aspect注解标注的标准类(@AspectJ风格)来实现的。 Join point【连接点】:Spring并没有抽象自己的连接点,而是复用AspectJ第三方包的JointPoint。切面规范...

Piemon&Anokata的博客 301
上一篇: 深入 Java 调试体系: 第 1 部分,JPDA 体系概览
下一篇: 中图法分类号(计算机专业)
mindhawk
博客等级 码龄20年 19粉丝 29原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值