AOP — 声明式切片

Jul 10, 2017 10:38:44 AM

作者:wendal

单纯的AOP

创建一个拦截器类,在方法执行前后打印一句日志

  1. package net.wendal.nutzbook.aop;
  2. import org.nutz.aop.ClassAgent;
  3. import org.nutz.aop.ClassDefiner;
  4. import org.nutz.aop.DefaultClassDefiner;
  5. import org.nutz.aop.InterceptorChain;
  6. import org.nutz.aop.MethodInterceptor;
  7. import org.nutz.aop.asm.AsmClassAgent;
  8. import org.nutz.aop.matcher.MethodMatcherFactory;
  9. public class UserAction { //被AOP的类,必须是public的非abstract类!
  10. /*将要被AOP的方法*/
  11. public boolean login(String username, String password) throws Throwable {
  12. if ("wendal".equals(username) && "qazwsxedc".equals(password)) {
  13. System.out.println("登陆成功");
  14. return true;
  15. }
  16. System.out.println("登陆失败");
  17. return false;
  18. }
  19. public static void main(String[] args) throws Throwable {
  20. //无AOP的时候
  21. UserAction ua = new UserAction(); //直接new,将按原本的流程执行
  22. ua.login("wendal", "qazwsxedc");
  23. System.out.println("-----------------------------------------------------");
  24. System.out.println("-----------------------------------------------------");
  25. ClassDefiner cd = DefaultClassDefiner.defaultOne();
  26. //有AOP的时候
  27. ClassAgent agent = new AsmClassAgent();
  28. LogInterceptor log = new LogInterceptor();
  29. agent.addInterceptor(MethodMatcherFactory.matcher("^login$"), log);
  30. //返回被AOP改造的Class实例
  31. Class<? extends UserAction> userAction2 = agent.define(cd, UserAction.class);
  32. UserAction action = userAction2.newInstance();
  33. action.login("wendal", "qazwsxedc");//通过日志,可以看到方法执行前后有额外的日志
  34. }
  35. }
  36. class LogInterceptor implements MethodInterceptor {
  37. public void filter(InterceptorChain chain) throws Throwable {
  38. System.out.println("方法即将执行 -->" + chain.getCallingMethod());
  39. chain.doChain();// 继续执行其他拦截器,如果没有,则执行原方法
  40. System.out.println("方法执行完毕 -->" + chain.getCallingMethod());
  41. }
  42. }

输出

  1. 登陆成功


方法即将执行 —>public boolean aop.UserAction.login(java.lang.String,java.lang.String) throws java.lang.Throwable
登陆成功
方法执行完毕 —>public boolean aop.UserAction.login(java.lang.String,java.lang.String) throws java.lang.Throwable

在Ioc中使用Aop

只有被Ioc容器管理的对象,才能使用AOP!!

声明拦截器

  • 你需要有一个拦截器对象,如果你愿意,你当然可以有不止一个拦截器对象。
  • 将这个对象声明在你的Ioc配置文件里,就像一个普通的对象一样

在对象的方法中声明切片

  • 在你要拦截的方法上,声明 @Aop 注解或者其他配置形式,如js/xml
  • @Aop 注解接受数目可变的字符串,每个字符串都是一个拦截器的名称,即必须在ioc中声明这个拦截器
  • 方法所在的对象必须是Ioc容器中的对象

将上一个例子,改造为Ioc形式

  1. package net.wendal.nutzbook.aop;
  2. import org.nutz.ioc.aop.Aop;
  3. import org.nutz.ioc.loader.annotation.IocBean;
  4. import org.nutz.ioc.loader.annotation.AnnotationIocLoader;
  5. import org.nutz.ioc.Ioc;
  6. import org.nutz.ioc.impl.NutIoc;
  7. @IocBean
  8. public class UserAction { //被AOP的类,必须是public的非abstract类!
  9. @Aop({"logInterceptor"}) //这里写拦截器bean的名字
  10. public boolean login(String username, String password) throws Throwable {
  11. if ("wendal".equals(username) && "qazwsxedc".equals(password)) {
  12. System.out.println("登陆成功");
  13. return true;
  14. }
  15. System.out.println("登陆失败");
  16. return false;
  17. }
  18. public static void main(String[] args) throws Throwable {
  19. Ioc ioc = new NutIoc(new AnnotationIocLoader("aop"));
  20. UserAction action = ioc.get(UserAction.class);
  21. action.login("wendal", "qazwsxedc");
  22. }
  23. }
  24. //另外一个类文件
  25. package net.wendal.nutzbook.aop;
  26. import org.nutz.ioc.loader.annotation.IocBean;
  27. import org.nutz.aop.InterceptorChain;
  28. import org.nutz.aop.MethodInterceptor;
  29. @IocBean //声明为一个Ioc的bean,名字为logInterceptor
  30. public class LogInterceptor implements MethodInterceptor {
  31. public void filter(InterceptorChain chain) throws Throwable {
  32. System.out.println("方法即将执行 -->" + chain.getCallingMethod());
  33. chain.doChain();// 继续执行其他拦截器
  34. System.out.println("方法执行完毕 -->" + chain.getCallingMethod());
  35. }
  36. }

已经为你准备好的拦截器

  • org.nutz.aop.interceptor.LoggingMethodInterceptor 添加日志记录
  • org.nutz.aop.interceptor.TransactionInterceptor 添加数据库事务(用于NutDao)

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/aop/aop.html