Spring笔记(七)
2016-06-21 17:36
351 查看
Spring基于@AspectJ和Schema的AOP
2016/6/21 13:08:12 seventeenWenAspectJ的用法
public interface Waiter { void greetTo(String name); void serveTo(String name); }
public class NativeWaiter implements Waiter{ public void greetTo(String name) { System.out.println("NativeWaiter greetTo"+name); } public void serveTo(String name) { System.out.println("NativeWaiter serveTo"+name); } }
@Aspect public class PreGreetAspectJ { @Before("execution(* greetTo(..))") public void beforeGreeting(){ System.out.println("你好! "); } }
public class AspectJProxyTest { public static void main(String[] args) { Waiter target =new NativeWaiter(); AspectJProxyFactory factory =new AspectJProxyFactory(); factory.setTarget(target); factory.addAspect(PreGreetAspectJ.class); Waiter proxy =factory.getProxy(); proxy.serveTo("seventeenWen"); proxy.greetTo("seventeenWen"); } }
NativeWaiter serveToseventeenWen 你好! NativeWaiter greetToseventeenWen
通过配置文件配置AspectJ切面
自动为使用了@AspectJ的类创建代理,它有一个属性proxy-target-class=”false”使用了JDK动态代理技术,true使用CGLib动态代理技术@AspectJ注解语法
AspectJ切点表达式:关键字+操作参数Spring支持AspectJ的九个切点表达式函数,分为四个类型:
方法切点函数:描述目标类方法信息定义
方法入参切点函数:描述目标类方法入参的信息定义
目标类切点函数:描述目标类类型信息定义
代理类切点函数:描述目标类的代理类饿信息定义
类名
类别 | 函数 | 入参 | 说明 |
方法切点函数 | execution() | 方法匹配模式串 | 满足某一匹配模式的所有目标类方法连接点 |
@annotation() | 方法注解类名 | 表示标注了特定的注解的目标方法的连接点 | |
方法入参切点函数 | args() | 通过判别目标类方法运行时入参对象的类型定义连接点 | |
@args() | 类型注解类名 | 通过判别目标方法运行时入参对象的类是否标注特定的注解 | |
目标切点函数 | within() | 类型匹配串 | 表示特定域下的所有连接点 |
target() | 类名 | 假如目标类按类型匹配于指定类,则目标类的所有连接点匹配这个切点 | |
@within() | 类型注解类名 | 类型注解类名 | 目标类标注了特定注解,则目标类所有连接点匹配该切点(包括实现类) |
目标类切点函数 | @target() | 类型注解类名 | 目标类标注了特定注解,则目标类所有连接点匹配该切点 |
代理类切点函数 | this() | 类名 |
AspectJ的通配符
*:匹配任意字符,但只能匹配上下文的一个元素..:匹配任意字符,可以匹配上下文的多个元素,表示类时必须和*一起使用,表示入参是则单独使用
+:表示按类型匹配的所有类,必须跟在类名后面,代表匹配类的继承和扩展指定类的所有类,同时还包括自己本身。
AspectJ的逻辑运算符
&&:与操作符,相当于切点的交集运算,如果在XML文件中配置,可以使用&的转义字符&代替,或者使用Spring提供的“and”,||:或操作符,相当于切点的并集运算,等效于“or”
!:非操作符,相当于切点的反集运算,等效于“not”
在操作符前后加空格
AspectJ的增强注解
@Before
前置增强,等于BeforeAdvice的功能value:定义切点
argNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开
@AfterReturning
后置增强,等于AfterReturningAdvicevalue:定义切点
pointcut:表示切点的信息,如果指定,将覆盖value
returning:将目标对象的返回值绑定给增强的方法
argsNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开
@Around
环绕增强:等于MethodInterceptorvalue:定义切点
argsNames:
@AfterThrowing
抛出增强,等于ThrowsAdvicevalue:定义切点
pointcut:
throwing:将抛出的异常绑定到增强方法上
argsNames:
@After
Final增强,不管是抛出异常还是正常退出,都会执行value:
argsNames:
@DeclareParents
引介增强,等于IntroductionInterceptorvalue:
deaultImpl:默认的接口实现
相关文章推荐
- 观察者模式(Observer)
- IT十八掌作业_java基础第十五天_IO串行化/深度复制
- Java操作ftp,上传,下载,删除操作
- 商业应用中Java浮点数的精确计算及表示
- java 实现倒计时的效果
- java容器类总结
- Eclipse 各种小图标的含义
- SpringMVC利用拦截器防止SQL注入
- Java的内存回收之内存泄漏与垃圾回收
- 类似java.lang.NoClassDefFoundError: org/jaxen/JaxenException解决方法
- java -- eclipse如何debug调试jdk源码
- Lombok 安装、入门 - 消除冗长的 java 代码
- Java中对于文件读取写入需要注意的事项
- Java多线程编程中ThreadLocal类的用法及深入
- eclipse集成weblogic开发环境的搭建
- eclipse中svn分支与合并
- listview 报java.lang.IllegalStateException异常的原因之一
- JAVA并发编程
- gc overhead limit exceeded eclipse解决方案
- bat demo和bat调用java获取传入参数