我正在学习面向方面的编程概念和Spring AOP。 我不理解切入点和连接点之间的区别 - 他们都似乎是我也一样。 一个切入点就是你申请你的意见和连接点也是我们可以将我们的意见的地方。 那么有什么区别?
切入点的一个例子可以是:
@Pointcut("execution(* * getName()")
什么可以成为连接点的例子吗?
我正在学习面向方面的编程概念和Spring AOP。 我不理解切入点和连接点之间的区别 - 他们都似乎是我也一样。 一个切入点就是你申请你的意见和连接点也是我们可以将我们的意见的地方。 那么有什么区别?
切入点的一个例子可以是:
@Pointcut("execution(* * getName()")
什么可以成为连接点的例子吗?
连接点:一个连接点是在一个方面可以插入的应用程序的程序执行的候选点这一点可能是被调用的方法,抛出异常,或者甚至一个字段被修改。 这些是您方面的代码可以插入到你的应用程序的正常流动,以增加新的行为点。
建议:这是一个对象,它包括API调用,以表示所述动作在由点所指定的连接点来执行系统广泛关注。
切入点:切入点定义在什么joinpoints,相关建议应当适用。 建议可以在AOP框架支持的任何连接点被应用。 当然,你不希望在所有可能的joinpoints的适用所有的方面。 切入点允许您指定要应用于您的咨询。 通常你指定使用显式的类和方法名,或通过定义匹配的类和方法名称模式正则表达式这些切入点。 一些AOP框架允许你创建确定是否根据运行时的决策,如方法参数的值应用建议动态切入点。
下图可以帮助您了解咨询,切入点,Joinpoints。
资源
释使用餐厅打个比方: 来源由@Victor
当你外出到餐馆,你看看菜单,看看几种可供选择。 您可以订购任何菜单上的项目的一个或多个。 但是,直到你真正命令他们,他们只是“机会来吃饭”。 一旦你下订单和服务员它带给你的表,它是一顿饭。
Joinpoints是菜单上的选项和切入点是您选择项目。
一个连接点是内码的机会,让你申请一个方面...只是一个机会。 一旦你把这个机会,选择一个或多个Joinpoints并应用方面给他们,你已经有了一个切入点。
要了解一个连接点和切入点之间的区别,认为切入点为指定织造规则和连接点为满足这些规则的情况。
在以下示例中,
@Pointcut("execution(* * getName()")
切入点定义规则说,建议应的getName任何包中的应用存在于任何类()方法和joinpoints将存在于类,以便建议可以在这些方法中应用的所有getName()方法的列表。
(在Spring的情况下,规则将在管理豆只和建议可以应用到唯一的公共方法适用)。
JoinPoints:这些基本上都是在实际的业务逻辑的地方,你要插入一些其他的功能,是必要的,但不是实际的业务逻辑的一部分。 JoinPints的一些例子是:方法调用,方法正常返回,方法抛出一个异常,实例化对象,引用的对象,等...
切入点:切入点是像被用来识别joinpoints正则表达式。 Pontcuts使用“切入点表达式语言”表达。 切入点,其中横切关注点需要被应用执行流程的要点。 有连接点和切入点之间的差值; Joinpoints都比较一般,并表示任何控制流,我们“可以选择”引入横切关注点,而切入点标识等joinpoints其中,“我们要”引入横切关注点。
某人外行解释谁是新的概念AOP。 这不是面面俱到,而是应该把握的概念帮助。 如果你已经熟悉了基本的术语,你现在可以停止阅读。
假设你有一个正常的Employee类,你希望每个这些方法调用的时候做一些事情。
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
这些方法称为JoinPoints。 我们需要一种方法来识别这些方法,使这个框架可以找到方法,它已经加载的所有classes.methods之中。 因此,我们将编写一个正则表达式匹配的这些方法的签名。 虽然还有更多的它,你会看到下面,但这个松散的正则表达式是什么定义切入点 。 例如
* * mypackage.Employee.get*(*)
*首先是修改公共/私营/保护/默认。 第二个*是该方法的返回类型。
但你还需要告诉两两件事:
这两者的组合被称为建议 。
你可以想像,你就必须写一个函数能够做到#2。 因此,这是怎么可能像这样的基本知识。
注:为了清楚起见,使用的不是字正则表达式 * * mypackage.Employee.get*(*)
在现实中,充分表达了进入的定义。
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
一旦你开始使用这些颇有几分,你可能最终确定许多@后/ @前/ @ Around建议。 重复的正则表达式最终将最终使事情混乱和难以维护。 所以,我们做什么,我们只是提供一个名称的表达,并在切面类使用它在其他地方。
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
顺便说一句,你也想在一个类来包装这整个逻辑,即所谓的看点 ,你会写一个类:
@Aspect
public class MyAwesomeAspect{....}
要获得这些东西的工作,你必须告诉Spring解析类阅读,理解并采取对@ AOP关键字行动。 一个办法做到这一点是确定在Spring配置XML文件如下:
<aop:aspectj-autoproxy>
像AspectJ的一个AOP语言比较像SQL数据查询语言,你能想到joinpoints(即在你的代码的所有地方,你可以织方面编码)与许多行的数据库表。 切入点就像一个SELECT stamement可挑行/ joinpoints的用户定义的子集。 你编织成选择那些地方的实际代码被称为建议。
无论涉及到“何处”的面向方面编程。
一个连接点是一个单独的地方,你可以使用AOP执行代码。 例如:“当一个方法抛出一个异常”。
切入点是连接点的集合。 例如,“当在类Foo的方法抛出一个异常”。
按照文档:
连接点:一个程序,执行期间的一个点,如方法的执行或异常的处理。
你可以考虑接合点在执行程序的事件。 如果您在使用Spring AOP,这甚至被限制在方法调用。 AspectJ中提供了更多的灵活性。
但是你从来没有处理所有的事件,你不要吃所有的食物在菜单中,当你去餐馆(我不认识你,你可能!不过,我肯定不)。 所以,你做一个选择事件的处理,并与他们做什么。 这里有云的切入点 。 按照文件,
切入点 :匹配连接点的断言。
然后你联想做什么用的切入点 ,有云咨询 。 按照文件,
通知和一个切入点表达式和在运行在切入点匹配的任意连接点相关联。
package com.amanu.example;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
* @author Amanuel Nega on 10/25/16.
*/
class ExampleBussinessClass {
public Object doYourBusiness() {
return new Object();
}
}
@Aspect
class SomeAspect {
@Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())")
public void somePointCut() {
}//Empty body suffices
@After("somePointCut()")
public void afterSomePointCut() {
//Do what you want to do before the joint point is executed
}
@Before("execution(* *(*))")
public void beforeSomePointCut() {
//Do what you want to do before the joint point is executed
}
}
ExampleBusinessClass
当代理版,是我们的目标! doYourBusiness()
是一个可能的连接点 SomeAspect
是我们的方面跨越到多个问题,例如屁股ExampleBusinessClass
somePointCut()
是一个切入点的定义,使我们共同的匹配点 afterSomePointCut()
是将我们的后执行的建议 somePointCut
切入点匹配doYourBusiness()
关节点 beforeSomePointCut()
也是匹配所有的咨询 public
的方法执行。 不像afterSomePointCut
,这一个使用嵌入式切入点声明 你可以看一下文档 ,如果你不相信我。 我希望这有帮助
一个JoinPoint:连接点在哪里执行的流程得到了改变像异常捕获,调用其他方法在你的程序的执行点。
切入点 :切入点基本上都是那些Joinpoints,你可以把你的建议(或叫方面)。
所以基本上切入点JoinPoints的子集 。
我同意mgroves。一个切入点可以被认为是多关节点的集合。 联合点指定特定的位置,其中的建议可以实施,其中作为切入点反映了所有关节点的列表。
类的实现 - 一个切入点的方面中。 基本上剪切点指的是建议中的切入点表达式。
对于例如,
@Before("execution(* app.purchase2.service.impl.*(..))")
public void includeAddOns(RolesAllowed roles) {
..
}
上述手段,“includeAddOns”方法调用(由于@Before咨询)的任何方法(在类的包内“app.purchase2.service.impl”)之前调用
整个注释被称为切入点@Before("execution(* app.purchase2.service.impl.*(..))")
关节点是实际的方法调用,其中加入所述方法中包“app.purchase2.service.impl”在一方面类方法“includeAddOns()”。
您可以访问与连接点的性质org.aspectj.lang.JoinPoint
类。
AOP在弹簧具有{顾问,咨询,切入点,连接点}
正如你所知道AOP是解耦从应用程序代码中的横切关注点逻辑(宽)的主要目的,为了实现这个春天,我们使用(咨询/顾问)
切入点是用来过滤,我们要准确地应用这个建议,像“所有的方法与插入启动”,所以其他的方法将被排除在外,这就是为什么我们在切入点接口{ClassFilter和MethodMatcher}
所以建议是跨领域的逻辑实现和顾问的建议加上的切入点,如果你只使用建议春天将其映射到顾问,使切入点TRUE,这意味着不阻止任何东西。 这就是为什么当你使用唯一的建议将它应用到目标类的所有方法,因为你没有过滤。
但连接点是程序中的位置,你可以考虑一下像反射,当你访问类的对象,然后就可以得到Method对象,那么你可以调用任何方法在这个类,这是编译器是如何工作的,如果你这样想这个你能想象的连接点。
连接点可以与现场,构造函数或方法,但在春天,我们只用方法连接点,这就是为什么在春天,我们(前,后,抛出左右)类型的连接点的,所有的人都指的是类的位置。
正如我提到的,你可以有不切入点(无过滤器)的意见那么它将被应用于所有的方法,也可以让顾问这是[建议和切入点]将其应用到具体的方法,但你不能有意见不像切入点连接点,你必须指定它,这就是为什么在春天的通知类型是完全相同的类型的连接点,所以当你选择一个建议您隐选择哪个连接点。
包,建议对您的方面到目标类的实现逻辑,这个建议应该有一个像调用之前一个连接点,调用之后,投掷后或周围的调用,那么您可以过滤要应用使用切入点,以它的确切位置过滤的方法或无切入点(没有过滤器),所以它会被应用于类的所有方法。
一个JoinPoint:它指定在应用程序中的点(方法),其中建议将被执行。
切入点:这是JoinPoints的组合,并指定了在该一个JoinPoint建议将被执行。
连接点是我们实际放置意见的地方
但切点为连接点的集合。 这意味着有多少这样我们CON放置交叉逻辑就是所谓的切入点