精华内容
下载资源
问答
  • SpringAOP切点表达式

    万次阅读 2020-12-25 21:18:58
    SpringAOP切点表达式 切点表达式(aop最难部分) execution(常用) 描述力度:描述具体到方法、参数、类型 举个栗子: @Pointcut("execution(* com.llds.seek.SeekAspect.*.*(..))") public void s(){ } ...

    SpringAOP切点表达式

    • 切点表达式(aop最难部分)

      • execution(常用)
        • 描述力度:描述具体到方法、参数、类型

        • 举个栗子:

          @Pointcut("execution(* com.llds.seek.SeekAspect.*.*(..))")
          public void s(){
          
          }
          
          execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
          这里问号表示当前项可以有也可以没有,其中各项的语义如下:
          
          *:代表(所有/任意)
          ..:代表任意参数,任意类型
          modifiers-pattern:方法的可见性,如public,protected
          ret-type-pattern:方法得返回值类型,如int、void等
          declaring-type-pattern:方法所在类的全路径名,如com.llds.service
          name-pattern:方法名类型,如show()、queryAllInfo()
          param-pattern:方法的参数类型,如String、int
          throws-pattern:方法抛出的异常类型,如Exception
          
      • within
        • 描述力度:具体到一个类
      • this
        • 代理对象
      • target
        • 目标对象
      • args
        • 描述力度:具体搜索某一个参数的类型

        • 举个栗子

          @Pointcut("args(java.lang.String)")
          public void s(){
              //会寻找所有参数是String类型的参数
          }
          
      • @annotation
        • 描述力度:具体搜索指定加了指定注解的方法

        • 举个栗子

          @Pointcut("@annotation(org.springframework.stereotype.Service)")
          public void s(){
              //会寻找所有方法上有@Service的方法
          }
          
      • @within
        • 描述力度:具体搜索加了指定注解的类

        • 举个栗子

          @Pointcut("@within(org.springframework.stereotype.Service)")
          public void s(){
              //会寻找所有加了@Service的类进行切入
          }
          
    展开全文
  • AOP中定义切点.pdf

    2021-09-14 10:31:48
    AOP中定义切点.pdf
  • 切点是表征图像中平面曲线局部形状变化的重要点特征,现有的研究鲜有涉及。构建了表征平面曲线局部几何特征的梯度相关矩阵(GCMs),通过GCMs行列式检测到了角点,但无法检测典型切点模型。由于GCM行列式仅在直线段...
  • spring 切点

    2011-10-23 11:01:32
    什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数从多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过&...

    什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数从多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过"切点"定位特定连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了;连接点相当于数据库中的记录,而切点相当于查询条件.
           在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点---其实确切地说,应该是执行点而非连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

    展开全文
  • 用AspectJExpressionPointcut实现的切点比JdkRegexpMethodPointcut实现切点的好处就是,在设置切点的时候可以用切点语言来更加精确的表示拦截哪个方法!可以精确到返回参数,参数类型,方法名。当然,也可以模糊匹配...

    转载请注明出处:http://blog.csdn.net/qq_26525215

    本文源自大学之旅_谙忆的博客

    用AspectJExpressionPointcut实现的切点比JdkRegexpMethodPointcut实现切点的好处就是,在设置切点的时候可以用切点语言来更加精确的表示拦截哪个方法!

    可以精确到返回参数,参数类型,方法名。

    当然,也可以模糊匹配。
    这里用纯Java的方式和配置xml的方法都来演示一遍。
    需要的包什么的就不解释了,如不动,请参考前面的。

    首先,准备好原型对象Person

    package cn.hncu.spring3x.aop.aspectj;
    
    public class Person {
        public int run(){
           System.out.println("我在run...");
           return 0;
       }
    
       public void run(int i){
           System.out.println("我在run...<"+i+">");
       }
    
       public void say(){
           System.out.println("我在say...");
       }
       public void sayHi(String name){
           System.out.println("Hi,"+name+",你好");
       }
       public int say(String name, int i){
           System.out.println(name+ "----"+ i);
           return 0;
       }
    
    }
    

    然后,用两种方式来拦截这个对象。

    纯Java方式实现

    4步曲:
    1、声明出代理工厂。
    2、设置切点
    3、设置通知
    4、为工厂添加切面
    请记住:切面=切点+通知

    AspectjDemo

    package cn.hncu.xmlImpl.aspectj;
    
    import org.aopalliance.aop.Advice;
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.junit.Test;
    import org.springframework.aop.Advisor;
    import org.springframework.aop.aspectj.AspectJExpressionPointcut;
    import org.springframework.aop.framework.ProxyFactoryBean;
    import org.springframework.aop.support.DefaultPointcutAdvisor;
    
    public class AspectjDemo {
    
        @Test
        public void demo(){
    
            ProxyFactoryBean factory = new ProxyFactoryBean();
            factory.setTarget(new Person());
    
            //声明一个aspectj切点
            AspectJExpressionPointcut cut = new AspectJExpressionPointcut();
    
            //设置需要拦截的方法-用切点语言来写
            cut.setExpression("execution( int cn.hncu.xmlImpl.aspectj.Person.run() )");//拦截:空参返回值为int的run方法
    
            Advice advice = new MethodInterceptor() {
                @Override
                public Object invoke(MethodInvocation invocation) throws Throwable {
                    System.out.println("放行前拦截...");
                    Object obj = invocation.proceed();//放行
                    System.out.println("放行后拦截...");
                    return obj;
                }
            };
    
            //切面=切点+通知
            Advisor advisor = new DefaultPointcutAdvisor(cut,advice);
            factory.addAdvisor(advisor);
            Person p = (Person) factory.getObject();
    
            p.run();
            p.run(10);
            p.say();
            p.sayHi("Jack");
            p.say("Tom", 666);
        }
    
    
    }
    

    运行结果:

    切点语言:

    AspectJExpressionPointcut对象在调用:
    setExpression时,这个方法的参数就是使用切点语言的。

    切点语言格式:

    execution ( 返回类型 方法路径.方法名(参数) )

    例子:

    //声明一个aspectj切点
            AspectJExpressionPointcut cut = new AspectJExpressionPointcut();
    
    cut.setExpression("execution( int cn.hncu.xmlImpl.aspectj.Person.run() )");//拦截:空参返回值为int的run方法
    cut.setExpression("execution( void cn.hncu.xmlImpl.aspectj.Person.*() )");//拦截:空参空返回值的任意方法
    cut.setExpression("execution (void cn.hncu.xmlImpl.aspectj.Person.*(String))");//拦截:只有1个String类型参数,空返回值的任意方法
    cut.setExpression("execution( void cn.hncu.xmlImpl.aspectj.Person.*(*) )");//拦截:有1个参数(类型不限),空返回值的任意方法
    cut.setExpression("execution( void cn.hncu.xmlImpl.aspectj.Person.*(*,*) )");//拦截:有2个参数(类型不限),空返回值的任意方法
    cut.setExpression("execution( void cn.hncu.xmlImpl.aspectj.Person.*(..) )");//拦截:任意(个数和类型)参数,空返回值的任意方法
    cut.setExpression("execution( int cn.hncu.xmlImpl.aspectj.Person.*(*,..) )");//拦截:至少有1个参数(类型不限),返回值类型是int的任意方法
    cut.setExpression("execution( * cn.hncu.xmlImpl.aspectj.Person.*(*,..) )");//拦截:至少有1个参数(类型不限),返回值类型任意的方法
    cut.setExpression("execution( * cn.hncu..*son.*(*,..) )");//拦截:cn.hncu包下,类名以"son"结束,至少有1个参数(类型不限),返回值类型任意的方法

    里面的参数是可以匹配正则表达式的。

    “.”代表除\r\n外的任意字符。
    “*”代表0个或多个。

    由于切点语言无法定义指定的多个返回值,所以,例如:

    如果需要拦截void和int返回值方法,则可以通过定义2个切点解决。

    xml配置AOP拦截

    AroundAdvice

    package cn.hncu.xmlImpl.aspectj;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class AroundAdvice implements MethodInterceptor{
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("前面拦截....");
            Object resObj = invocation.proceed();//放行
            System.out.println("后面拦截.....");
            return resObj;
        }
    
    }
    

    配置文件

    <?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:context="http://www.springframework.org/schema/context"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
        <!-- 自动代理 -->
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
    
        <bean id="p" class="cn.hncu.xmlImpl.aspectj.Person"></bean>
    
        <!-- 切面=切点+通知 (把切点和通知写成内部bean)-->
        <bean id="cut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
            <!-- 拦截:cn.hncu包下,类名以"son"结束,至少有1个参数(类型不限),返回值类型任意的方法 -->
          <property name="expression" value="execution( * cn.hncu..*son.*(*,..) )"></property>    
        </bean>
    
        <bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
           <property name="pointcut" ref="cut"></property>
           <property name="advice">
                <bean id="advice" class="cn.hncu.xmlImpl.aspectj.AroundAdvice"></bean>
           </property>
        </bean>
    
    
    </beans>

    中间也可以这样配置:

    <!-- 自动代理 -->
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
    
        <bean id="p" class="cn.hncu.xmlImpl.aspectj.Person"></bean>
    
        <!-- 切面=切点+通知 (※※采用面向切点语言进行配置切面)-->
        <bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
           <property name="expression" value="execution( * cn.hncu..*son.*(*,..) )"></property>
           <property name="advice">
                <bean id="advice" class="cn.hncu.xmlImpl.aspectj.AroundAdvice"></bean>
           </property>
        </bean>

    测试类:

    package cn.hncu.xmlImpl.aspectj;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class AspectjXmlDemo {
        @Test
        public void demo1(){
            ApplicationContext ctx = new ClassPathXmlApplicationContext("cn/hncu/xmlImpl/aspectj/aspectj.xml");
            Person p = ctx.getBean(Person.class);
            p.run();
            p.run(10);
            p.say();
            p.sayHi("Jack");
            p.say("Tom", 666);
        }
    }
    

    测试结果

    在本例:xml配置与纯Java方式相比,即把通过Java代码new出来的对象,通过xml配置来造对象。

    如果是开发项目,用Spring的框架,我们的一些通过xml注入的对象就只需要依赖xml文件了。
    而依赖xml的依赖不叫依赖,也就是独立了。

    本文章由[谙忆]编写, 所有权利保留。

    转载请注明出处:http://blog.csdn.net/qq_26525215

    本文源自大学之旅_谙忆的博客

    展开全文
  • 主要介绍了SpringAOP切点函数实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 两圆的切点.txt

    2019-07-10 13:42:45
    求两圆的切点,网上查找了一些资料,发现方案挺多的,我选取了几个测试了下,这个就是我通过的代码了。可直接使用。这个跟CAD关系不大,绘图求点的其他工程都可以使用。
  • Spring Aop切点

    2018-04-13 11:40:00
    切点用于准确定位应该在什么地方应用切面的通知。通知和切点是切面的最基本的元素。在Spring AOP中要使用AspectJ的切点表达式来定义切点。下面我们列出Spring AOP所支持的AspectJ切点指示器。 AOP原理图 ...

    切点用于准确定位应该在什么地方应用切面的通知。通知和切点是切面的最基本的元素。在Spring AOP中要使用AspectJ的切点表达式来定义切点。下面我们列出Spring AOP所支持的AspectJ切点指示器。

     
    AOP原理图
    AspectJ指示器描述
    arg()限定连接点匹配参数为指定类型的执行方法
    @args()限定连接点匹配参数由指定注解标注的执行方法
    execution()用于匹配连接点执行的方法
    this()限定连接点匹配AOP代理的类型bean引用为指定类型的类
    target()限定连接点匹配目标对象为指定类型的类
    @target()限定连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解
    within()限定匹配连接点指定的类型
    @within()限定匹配连接点指定注解所标注的类型(当使用Spring AOP时,方法定义在指定的注解所标注的类里)
    @annotation限定匹配带有特定注解的连接点

    在Spring 中尝试使用AspectJ其他的的指示器,将会抛出IllegalArgumentException异常。我们看到在上面介绍的指示器中只有execution()是实际执行匹配的,而其他指示器都是限制匹配的。所以我们通常使用execution指示器匹配,然后通过其他指示器进行限制。

    1.编写切点

    为了阐述Spring中的切面,我们要限定一个切点:

    public interface Performance { public void perform(); } 

    下面我们定义一个表达式,设置当perform()执行时触发通知的调用:

     
    匹配表达式
    execution(* concert.Perfirmance.perform(..)) 

    第一个*代表匹配所有类型的返回值,中间的类名.方法名指定匹配的类的特定方法,()中的 .. 表示匹配所有的参数列表。
    我们好可以在ececution中使用其他的匹配器,用来过滤匹配的方法:

    execution(* concert.Perfirmance.perform(..) && within(concer.*)) 

    上面的表达式表示匹配concert.Perfirmance的perform方法,并且该方法在concer包中。里面的&&表示与的意思,除此之外还有 || 表示或, ! 表示非。但是 & 在Xml中有特殊的含义,这时我们也可以使用 and 代替 && ,用 or 代替 || ,用 not 代替 !。

    2.在切点中选择bean

    处理上面;列出的指示器外,Spring还支持一种新的指示器bean(),它允许我们在切点中使用bean的ID来标示bean:

    execution(* concert.Perfirmance.perform(..)  and bean('woodstock'))
    

    在这里我们限定了bean的ID为 woodstock,其实bean()指示器更多的使用场景是 除去特定ID的bean应用通知:

    execution(* concert.Perfirmance.perform(..)  and !bean('woodstock'))


    作者:郭之源
    链接:https://www.jianshu.com/p/0dc2eea8e59e
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    转载于:https://www.cnblogs.com/zjdeblog/p/8819405.html

    展开全文
  •  在Spring AOP中,要使用AspectJ的切点表达式语言来定义切点。  1.Spring AOP支持的AspectJ指示器:  1)arg():限制连接点匹配参数为制定类型的执行方法。  2)@args():限制连接点匹配参数由指定注解...
  • 主要介绍了Spring AOP中定义切点的实现方法,结合实例形式分析了spring面向切面AOP定义切点的具体步骤、实现方法与相关操作技巧,需要的朋友可以参考下
  • AOP切点相关

    2019-10-08 08:21:50
    1、切点定义 切点定义包含两个部分 一个切入点表达式 一个包含名字和任意参数的方法签名 package com.sysker.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut;...
  • @AspectJ切点函数详解

    千次阅读 2019-10-24 18:07:30
    @AspectJ切点函数详解5.3.1 方法切点函数5.3.1.1 execution()5.3.1.2 @annotation()5.3.2 方法入参切点函数5.3.2.1 args()和@args()5.3.3 目标类切点函数5.3.3.1 within()5.3.3.2 @within()与@target()5.3.3.3 ...
  • 重用切点表达式

    2019-04-29 16:37:00
    这部分主要针对众多相同切面表达式进行提取...然后其他通知注释中使用value=""的方式使用这个切点表达式    至于其他类,如果也想使用这个切点表达式,和引用其他函数方法的方法一样 转载于:https://www....
  • spring 切点表达式

    2019-09-30 17:06:47
    spring切点表达式: 1、*通配符:该通配符主要用于匹配单个单词。 例如:execution(* com.bonnie.Controller.TestController.*()) 上述表达式表示:返回值为任意类型,TestController类的任意没有参数的方法 ...
  • APO切点表达式

    2019-10-29 10:25:46
    在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要...execution()是最常用的切点函数,其语法如下所示: 整个表达式可以分为五个部分: 1、execution(): 表达式主体。 2、第一个*号:...
  • Pointcut 切点

    2014-04-11 10:59:26
    Pointcut (切点) 决定advice 通知应该作用于那个连接点,也就是说通过Pointcut来定义需要增强方法的集合,这些集合的选取可以按照一定的规则来完成。  在Pointcut的基本接口定义中可以看到,需要返回一个...
  • 切点类必须加入@Aspect注解(切面) 通知指的就是指拦截到连接点之后要执行的代码,通知分为 前置@before 、后置@after、异常@afterThrowing、最终@afterReturning、环绕@around通知五类,返回的值是切点处的方法...
  • Spring—切点表达式

    2018-05-28 15:55:43
    摘要: Spring中的AspectJ切点表达式函数 切点表达式函数就像我们的GPS导航软件。通过切点表达式函数,再配合通配符和逻辑运算符的灵活运用,我们能很好定位到我们需要织入增强的连接点上。经过上面的铺垫,...
  • 通达信指标公式源码 精准切点,爆发.doc
  • Spring切点定义集锦

    千次阅读 2018-09-12 11:13:35
    学习spring比较久了,但切点表达式一直记不住,今天特意整理,供参考! Spring 切点定义方式 类别 函数 入参 说明 方法切点函数 execution() ...
  • 切点的定义

    2018-04-27 16:00:00
    1.bean的定义格式(了解) @Around("bean(userService)") @Around("bean(userService)||...2.类定义切点的格式(了解) @Around("within(cn.tedu.store.service.UserService)") @Around("within(cn.tedu.s...
  • Spring-AOP 复合切点切面

    千次阅读 2017-08-20 15:50:37
    概述 ComposablePointcut源码 ComposablePointcut的...实例概述通过上面几篇文章我们发现,实例中的定义的切面仅有一个切点,有的时候,一个切点可能难以描述目标连接点的信息。上篇博文 Spring-AOP 流程切面的例子,
  • AspectJ切点函数

    2018-03-09 21:30:18
    1. 方法切点函数 execution():根据匹配规则匹配 eg:前置增强@Before(execution(public * *Service(..))) 匹配所有以Service结尾的方法 @annotation():根据相应的的注解匹配 eg:后置增强@AfterReturning(“@...
  • SpringBoot 配置事务切点 package com.zdww.eemp.arev.biz.internal.config.transaction; import org.aspectj.lang.annotation.Aspect; import org.springframework.aop.aspectj.AspectJExpressionPointcut; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,790
精华内容 13,516
关键字:

切点