AOP — 声明式切片

单纯的AOP

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

在Ioc中使用Aop

  1. 只有被Ioc容器管理的对象,才能使用AOP!!
  2. 声明拦截器
  3. * 你需要有一个拦截器对象,如果你愿意,你当然可以有不止一个拦截器对象。
  4. * 将这个对象声明在你的Ioc配置文件里,就像一个普通的对象一样
  5. 在对象的方法中声明切片
  6. * 在你要拦截的方法上,声明 @Aop 注解或者其他配置形式,如js/xml
  7. * @Aop 注解接受数目可变的字符串,每个字符串都是一个拦截器的名称,即必须在ioc中声明这个拦截器
  8. * 方法所在的对象必须是Ioc容器中的对象
  9. 将上一个例子,改造为Ioc形式
  10. {{{<JAVA>
  11. package net.wendal.nutzbook.aop;
  12. import org.nutz.ioc.aop.Aop;
  13. import org.nutz.ioc.loader.annotation.IocBean;
  14. import org.nutz.ioc.loader.annotation.AnnotationIocLoader;
  15. import org.nutz.ioc.Ioc;
  16. import org.nutz.ioc.impl.NutIoc;
  17. @IocBean
  18. public class UserAction { //被AOP的类,必须是public的非abstract类!
  19. @Aop({"logInterceptor"}) //这里写拦截器bean的名字
  20. public boolean login(String username, String password) throws Throwable {
  21. if ("wendal".equals(username) && "qazwsxedc".equals(password)) {
  22. System.out.println("登陆成功");
  23. return true;
  24. }
  25. System.out.println("登陆失败");
  26. return false;
  27. }
  28. public static void main(String[] args) throws Throwable {
  29. Ioc ioc = new NutIoc(new AnnotationIocLoader("aop"));
  30. UserAction action = ioc.get(UserAction.class);
  31. action.login("wendal", "qazwsxedc");
  32. }
  33. }
  34. //另外一个类文件
  35. package net.wendal.nutzbook.aop;
  36. import org.nutz.ioc.loader.annotation.IocBean;
  37. import org.nutz.aop.InterceptorChain;
  38. import org.nutz.aop.MethodInterceptor;
  39. @IocBean //声明为一个Ioc的bean,名字为logInterceptor
  40. public class LogInterceptor implements MethodInterceptor {
  41. public void filter(InterceptorChain chain) throws Throwable {
  42. System.out.println("方法即将执行 -->" + chain.getCallingMethod());
  43. chain.doChain();// 继续执行其他拦截器
  44. System.out.println("方法执行完毕 -->" + chain.getCallingMethod());
  45. }
  46. }
  47. }}}

已经为你准备好的拦截器

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