一:一个典型的aspect类的形式如下:
public aspect MyAspectj {
//定义连接点函数
pointcut callF(): execution(* f(..)) && cflow(call(* Test.foo(..)));
//定义通知函数
before() : callF() {
System.out.println("before call f();");
}
}
二:切点pointcut的定义:
1):方法的访问
1: execution():表示方法执行是进行匹配,如下所示:
execution(void Test.setX(int,**))
2: call():表示在方法被调用时候进行匹配,如下所示:
call(void Test.setX(int,**))
2):字段的访问:
1: set():表示目标对象的修改,如下所示:
before(int newval): set(int Test.x) && args(newval) {
if(newval > Test.MAX_CHANGE) {
throw new RuntimeException("error");
}
}
public static final int MAX_CHANGE = 100;
int x = 100;
public static void main(String[] args) {
Test t = new Test();
t.x = 10000;
System.out.println(t.x);
}
2:get():表示目标对象的获取,如下所示:
before(): get(int Test.x)
3):对象的状态:
1:this(SomeType):表示当前在执行的对象是SomeType类型进行匹配。
2:target(SomeType):表示目标对象是SomeType类型时进行匹配。
3:args(SomeType):表示目标函数的函数参数是SomeType类型时进行匹配。
4):连接点执行流程
1:cflow(pointcut):表示在执行连接点pointcut所匹配的函数时进行匹配,如下所示:
cflow(call(void Test.main()))
其中的call(void Test.main())就是一个连接点;
2:cflowbelow(pointcut):表示执行连接点pointcut之外所匹配的函数是进行匹配,如下所示。
cflow(call(void Test.main()))
5):属于关系
1:within(MyClass)表示当前正在执行的代码属于MyClass类时进行匹配(连接点匹配的时候只匹配Myclass类中的连接点),如下所示:
within(point)
2:withincode(method):表示在属于method函数时进行匹配,例如夏例表示的时匹配函数foo()的调用。
withincode(public void foo())
三:匹配表达式的通配符
使用星号"*"可以匹配切点中函数表达式中的任何一个元素,包括函数的修饰符,返回值的类型,类名,方法名,参数名。
1)星号(*)
1:下例将匹配任何函数,而不管函数返回什么的类型。
execution(* *(..))
2:下例用来匹配任何名为set的方法,而不管函数返回的类型。
call(* set(..))
3:下例用于匹配返回值为int型的任何函数。
execution(int *(..))
4:下例用来匹配函数名为setY,参数类型为long的函数。
call(* setY(long))
5:下例用于匹配类Point的函数setY,且函数的参数类型为int。
call(* Point.setY(int))
6:下例用来匹配任意的构造函数,且该构造函数含有两个int类型的参数。
call(*.new(int,int))
7:下例用来匹配任何public类型的函数。
call(public * *(..))
8 : 下例用来匹配任何非静态的函数。
execution(!static * *(..))
9:下例用来匹配任何public类型的,非静态的函数
execution(public !static * *(..))
2):加号(+)
1:匹配Foo的构造函数
call(Foo.new())
2:下例表示Foo及其所有子类的构造函数。
call(Foo+.new())
3:下例以Handler结尾的类名及其所有子类的构造函数。
call(*Handler+.new())
四:匹配表达式的组合
!:逻辑非;
|| or OR:逻辑或;
&& or And:逻辑与;
():用于分钟。
一些切点的实例:
//实例一:
pointcut setBefore(Object point, Integer id) : target(point)
&& execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
&& args(id,..);
before(Object point, Integer id) : setBefore(point, id){
System.out.println("多个参数的方法中args的使用");
}
//实例二:
pointcut setBefore(Object point, Integer key) : target(point)
&& ( execution(public void com.gaojian.aspectj.java1.*.setId(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAge(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
)
&& args(key,..);
before(Object point, Integer key) : setBefore(point, key){
System.out.println("设值的参数为:"+key);
}
//实例三:
pointcut setIdBefore():execution(* setId(..)) && (within(com.gaojian.aspectj.java1.PointcutClass1) || within(com.gaojian.aspectj.java1.PointcutClass2));
before() : setIdBefore(){
System.out.println("切入点中within的使用");
}
分享到:
相关推荐
2. Pointcut:Pointcut定义了Advice应该在何时何地执行。它是一个匹配条件,通常基于方法签名、注解、类名等来定位。在上面的例子中,pointcut可能表示为`BeanImpl`类中的所有public方法,或者更具体地,是`the...
Pointcut定义了相应的Advice将要发生的地方。 4. Advice(增强):Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过before、after、around来区别是在每个Join Point之前、之后还是代替执行的代码。 ...
基于Spring Boot框架的综合应用系统 项目简介 本项目是一个基于Spring Boot框架的综合应用系统,涵盖了从基础的Maven项目创建、数据校验、日志管理到高级的权限管理、消息队列、定时任务... 使用Pointcut定义切点。
Pointcut定义了哪些方法或在何时应用Advice。它可以是基于方法签名、类名或者其他的匹配规则。在例子中,pointcut没有显式地定义,而是通过配置文件隐含地指定,即所有实现了`Bean`接口的方法。 3. Advisor(顾问...
Pointcut 定义了何处执行通知(advice)。它们可以定义在类型内: ```java private pointcut pc(): call(void Foo.m()); ``` 这是一个仅在定义类型内部可见的点切入口。也可以定义包可见的点切入口: ```java ...
2. 定义切入点:使用@Pointcut定义切入点表达式,可以是方法签名、注解等。 3. 应用通知:在通知方法上使用@Before、@After等注解,并引用切入点表达式。 4. 配置AOP:在Spring配置文件或使用@Configuration注解的类...
2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...
在AOP中,Pointcut定义了拦截哪些方法,而Advisor则包含了一个通知和一个切入点表达式。`5.AOP - Pointcut & Advisor.md`可能会详细解释这两者的使用方式和作用。 **6. AOP - 自动创建Proxy** Spring支持两种代理...
通过@Pointcut定义切入点,配合@annotation注解用于匹配标注了特定注解的方法,@Around注解可以实现环绕通知,即在目标方法执行前后进行逻辑处理。 整个AOP使用过程实际上是开发者定义好的通知逻辑与业务逻辑的无缝...
此外,还可以使用@Aspect注解来声明一个切面,使用@Pointcut定义切点,@Before、@After、@Around、@AfterReturning和@AfterThrowing来定义各种类型的通知。 总之,Spring AOP操作的核心在于理解并正确使用上述jar包...
- **注解配置**:Spring 2.5引入了基于注解的AOP,可以直接在切面类上使用@Aspect,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 4. **切点表达式** - 切点表达式是用于匹配连接点的语句,如`...
切面可以是方法拦截器,通过@Aspect注解定义,并使用@Pointcut定义切入点表达式,来指定何时应用这些拦截器。 2. **切入点**:切入点是AOP的核心概念,定义了切面应何时执行。它可以是一个方法签名,一个包名,甚至...
2. **Pointcut**:Pointcut定义了Advice插入的位置,通常是特定类或方法。它可以基于方法签名、注解或其他条件来指定。 3. **Advisor**:Advisor是将Pointcut和Advice组合在一起的组件,它决定了何时、何地以及如何...
4. 注解驱动的AOP:利用Spring的@Aspect注解创建切面,@Pointcut定义切入点,@Before、@After等定义通知。 五、应用场景 1. 日志记录:在方法调用前后记录日志,无需在每个方法中重复代码。 2. 事务管理:在全局...
1. 注解驱动(Annotation-based):使用@Aspect注解定义切面,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 2. 配置驱动(XML-based):在spring配置文件中定义切面、通知和切点。 三、Spring ...
在Spring中,我们可以通过定义切面(Aspect)、切点(Pointcut)、通知(Advice)以及织入(Weaving)等方式来实现AOP。 集成AOP的第一步是确保项目已经正确配置了Spring Boot和Maven。在`pom.xml`文件中,我们需要...
最后,使用@Aspect注解创建切面,并通过@Pointcut定义切点,结合通知,就能实现面向切面的编程。 这个"SpringDemo_lj"项目中,很可能会包含以下文件: 1. **配置文件**(如:applicationContext.xml):定义Bean...
- Spring 提供了 `org.springframework.aop.Pointcut` 接口来定义切入点,可以基于类名和方法名来匹配执行点,可以是静态的也可以是动态的,动态匹配会考虑方法参数。 5. **ProxyFactoryBean**: - 用于创建代理...