基于@AspectJ和Schema的AOP
2021-02-02 05:13
标签:href val rgs 函数 pojo inter not parent 入参 Spring在新版本中对AOP功能进行了重要的增强: @param @return 等Javadoc标签就是注解标签,为第三方工具提供了描述程序代码的注释信息。Java5.0注解可以看做javadoc和Xdoclet标签的延伸与发展。在Java5.0中可以自定义这些标签,并通过java语言的反射机制来获取类中标注的注解,完成特定的功能。 测试类 此时会发现,在PreGreetingAspect 切面类中定义的前置方法和通过BeforeAdvice接口定义的前置方法增强不一样,一个明显的区别是PreGreetingAspect 类的beforeGreeting()方法没有任何入参,而BeforeAdvice的接口方法before(Method method, Object[] args, Object target)的入参提供了一条访问目标对象方法和入参的途径。@Aspect定义的切面也提供了访问目标对象连接点信息的方法。 xml配置 schema-aop配置 切点表达式由关键字和操作参数组成,如execution(* greetTo(..)) @Aspect支持3种通配符 切点表达式由切点函数组成,切点函数之间还可以进行逻辑运算,组成复合切点。Spring支持以下切点运算符 Spring本身使用接口描述各种增强类型,@AspectJ也为各种增强类型提供了不同的注解类,它们位于org.aspectj.lang.annotation.*包中。这些注解拥有若干个成员,可以通过成员完成定义切点信息,绑定连接参数等操作。注解期限都是RetentionPolicy.RUNTIME,标注目标都是ElementType.METHOD。 切点函数是AspectJ表达式语言的核心,也是使用@AspectJ进行切面定义的难点。 基于@AspectJ和Schema的AOP 标签:href val rgs 函数 pojo inter not parent 入参 原文地址:https://www.cnblogs.com/nangonghui/p/13170383.htmlSpring对AOP的支持
SpringAOP包括基于XML配置的AOP和AspectJ注解的AOP.
虽然AspectJ提供对AOP更为细致的实现,但像实例化切面,属性访问切面、条件切面等功能,在实际应用中并不常见。Java5.0注解知识
注解是代码的副属信息,遵循一个原则:注解语言不能直接干涉程序代码的运行,无论删除或增加注解,代码都能正常运行。第三方工具可以利用代码中的注解间接控制程序代码的运行,他们通过java反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑,SpringAOP对@AspectJ提供支持,正是采取这种方法。使用@AspectJ
定义切面类
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
//通过该注解定义一个切面
@Aspect
public class PreGreetingAspect {
@Before("execution(* greetTo(..))")//定义切点和增强类型
public void beforeGreeting(){//增强的横切逻辑
System.out.println("How are you");
}
}
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
public class AspectJProxyTest {
public static void main(String[] args) {
Waiter target = new NaiveWaiter();
//定义一个Aspect类型的代理工厂
AspectJProxyFactory factory = new AspectJProxyFactory();
//设置代理目标类
factory.setTarget(target);
//添加切面类
factory.addAspect(PreGreetingAspect.class);
//生成织入切面的代理对象
Waiter proxy = factory.getProxy();
proxy.greetTo("欢欢");
proxy.serveTo("欢欢");
}
}
通过配置使用@AspectJ
@AspectJ语法基础
切点表达式函数
Spring支持9个@AspectJ切点表达式函数,用不同的方式描述目标类的连接点,根据描述对象的不同,大致分为4类:
详情请参考博客在函数入参中使用通配符
:匹配任意字符,但它只能匹配上下文中的一个元素
..:匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和联合使用,而在入参时则单独使用。
+:表示按类型匹配指定类的所有类,必须跟在类名后面,如com.smart.Car+。继承或扩展指定类的所有类,同时还包括指定类本身。
[详情参考博客](https://blog.csdn.net/gexiaoyizhimei/article/details/99988144)逻辑运算符
@Aspect中并不提供and or not,它们是Spring为了在xml配置文件中方便定义切点表达式而特意添加的等价运算符,和一般的语法表达式不一样,在Spring中使用and or not 时,允许不在前后添加空格。不同增强类型
前置增强,相当于BeforeAdvice.Before注解类有两个成员。
后置增强, ==AfterReturningAdvice
环绕增强 == MethodInterceptor
抛出增强,相当于ThrowsAdvice
Final增强,不管是抛出异常还是正常退出,该增强都会得到执行。该增强没有对应的增强接口,可以看成ThrowsAdvice和AfterReturningAdvice的混合物,一般用于释放资源,相当于try{}finally{}的控制流。
引介增强, == IntroductionInterceptor
引介增强用法
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
@Aspect
public class EnableSellerAspect {
@DeclareParents(value = "com.ijianghu.advice.impl.NaiveWaiter",//指定要增强的目标类
defaultImpl = com.ijianghu.aspect.impl.SmartSeller.class) //指定目标增强实现类
public Seller seller; //要实现的目标接口
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DeclareAspectJProxyTest {
public static void main(String[] args) {
String configPath = "com\\ijianghu\\aspect\\config\\applicationContext-schema-declare.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter waiter = (Waiter) ctx.getBean("waiter");
waiter.greetTo("欢欢");
Seller seller = (Seller)waiter;
seller.sell("beer");
}
}
切点函数详解
上一篇:Json web token
下一篇:opnet实现仿真任务流程概述