切入点表达式 (含args()获取参数方法)

本文详细介绍了AOP中的切点表达式概念及其使用方法,重点解析了execution指示符的功能与应用场景,并通过实例展示了如何定义切入点以实现方法增强。

你们是否在用aop时经常看到这些东西------->@Before("execution(* test.*.*(..)))   这种东西是切点函数,  execution叫做切入点指示符,它有很多种类:execution,within,this,target,args,bean(我们只要讲最为常用的execution)    execution:英译中是执行的意思    切入点指示符后面写的这些正则一样的东西是切入点表达式   

切入函数=切入点指示符+切入点表达式 ;

切入点表达式:(execution)   : (修饰符(可省略)   返回值类型    包名(可省略).类名(可省略).方法名(形参名)) 所以至少得有三参数:返回值类型,方法名,形参名  

execution除了英语中是执行的意思,那么在aop中它是什么意思了?

它的作用:使被它修饰的方法插入到切入点表达式所指向的方法中(即根据方法名和参数寻找目标类中的方法,然后对其增强).(也就是说execution是一个在文件中寻找目标方法的切点指示符,然后把它下面的(修饰的)方法增添到目标方法前面或者后面,亦或者阻止目标方法方法的执行(实际看目标方法使用什么注解:@after,@before@around))

 
你们是否懂了点关于切入点表达式了,不懂的话请看下面的代码

package test;

import org.springframework.stereotype.Component;
目标类1:组件类:主要类
@Component
public class test {
    public void test1(String name,String does) {
        System.out.println(name+does);
    }
}


import org.springframework.stereotype.Component;

目标类2

@Component
public class test1 {
    public void test(String one,String two,String three) {
        System.out.println(one+two+three);
    }
}

切面类:增强类:通知类
@Aspect
public class aspect {
    @Before("execution( * *(..))") 我这里execution写了必要的三点 返回值类型,方法名,形参    

        对于返回值---->*代表所有类型的返回值

        对于方法名---->同理上

        对于形参------->..代表所有类型的形参,同时也表示不计较参数数量(另外*在形参中只代表一个任意类型的形参*,*用逗号隔开的表示允许获取两个任意类型的形参)

       execution的形参是没有多大作用的(但是你必须得匹配参数数量与目标方法所带参数量一致,当然你也可以用..来规避这个问题)

        为什么说execution的参数没多大作用了?

       (指示符仅有execution的条件下)因为execution的作用根据方法和参数数量找到目标方法,然后对目标方法进行加强,而并不是为了获取目标方法信息,所以execution只要有形参就ok了,但是如果我们想获取目标方法的参数,那么我们必须加上args()切入指示符.即如果它所修饰的方法(即加强方法或者又叫通知方法)已经带参了,那么excution就带不动它了,如果你在没有添加args()切入指示符的情况下,execution是会报错的,如下图:



因为它所带的方法只能是无参的,execution带参那么必须添加args(one,two)..此处的one,two必须与加强方法(通知方法)所带的参数一致.
    private void test() {
        System.out.println("我是一个切入点");
    }    
}    

配置

<?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: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/context
                             http://www.springframework.org/schema/context/spring-context-2.5.xsd
                             http://www.springframework.org/schema/aop
                             http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                            ">
        <context:component-scan base-package="test">
            <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
        </context:component-scan>
        <aop:aspectj-autoproxy/>
</beans>

运行类;测试类import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ac {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        test t=ac.getBean(test.class);
        test1 t1=ac.getBean(test1.class);
        t.test1("林先生", "打代码");
        t1.test("1", "2","3");
    }
}


输出的结果:


另外一个问题:如果execution修饰的方法带参,使用args()的情况

@Aspect
public class aspect {
    @Before("execution(* *(..))"+"&&args(a,b)")
    private void test(String a,String b) {
        System.out.println("获取目标方法参数a:"+a);
        System.out.println("我是一个切入点");
        System.out.println("获取目标方法参数b:"+b);
    }    
}   
}   


结果输出:


好了今天的切入指示符学习到这里了.......

### JavaScript 中 `args` 参数的使用方法 在 JavaScript 函数中,`args` 是一种常见的命名约定,用于表示传入函数的一组参数。通常情况下,它是一个对象或者数组形式的数据结构,允许开发者通过解构或其他方式提取其中的内容。 #### 对象解构的方式 当 `args` 被定义为一个对象时,可以利用 **对象解构** 提取其属性值。这种方式特别适合处理具有默认值的情况。例如: ```javascript function foo(args) { let { name, age, job, flag } = Object.assign({ age: null, job: 'Programmer', flag: false }, args); console.log(name, age, job, flag); // 输出解构后的变量 } ``` 上述代码片段展示了如何通过 `Object.assign()` 将默认值与实际传参合并[^1]。如果调用该函数时未提供某些键,则会自动填充默认值。 #### 数组解构的方式 除了对象之外,还可以将 `args` 定义成数组并应用 **数组解构** 技术来获取单个元素。比如下面的例子说明了这一过程: ```javascript function bar([firstArg, secondArg]) { console.log(firstArg, secondArg); } bar(['hello', 'world']); // hello world ``` 这里我们看到的是另一种类型的参数解析——基于位置而不是名称。这适用于那些顺序固定的输入场景。 #### Rest Parameters 的运用 另外,在 ES6 及之后版本里引入了一个叫做 rest parameters 的特性,它可以用来收集不定数量的实际参数到一个名为 arguments 的类数组当中去。虽然严格意义上讲这不是关于单独某个叫作 “args”的形参讨论范围内的东西,但它确实提供了另一种灵活管理多变数目的实参手段: ```javascript function baz(...args){ console.log(args.length); for(let arg of args){ console.log(arg); } } baz('a','b',{key:'value'}); // Output: // 3 // a // b // [object Object] ``` 综上所述,`args` 在 JavaScript 中的具体实现取决于上下文需求以及个人偏好;既可以作为普通变量名代表整个参数列表,也可以配合现代语法特征如解构赋值等增强可读性和功能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值