• Home
  • About
    • yukiiris photo

      yukiiris

      少说话,多读书

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects
  • Moon

spring学习笔记(二)

11 Aug 2017

Reading time ~1 minute

概述

    AOP(Aspect Oriented Programming),面向方面编程,解耦本不该彼此粘合的功能,比如业务逻辑和日志、权限、异常处理等。

AOP和OOP的比较

  • OOP很好的实现了现实到软件的转换。
  • OOP在日志、事务处理、权限管理方面会产生大量重复代码。
  • AOP能将应用分为核心关注点和横切关注点
  • AOP中,每个关注点不知道是否有其他关注点关注它
  • AOP是OOP的补充

### AOP的Java实现

通用方法

public class TimeBook{
  private Logger logger = Logger.getLogger(this.getClass().getName());
  //审核数据
  public void doAuditing(String name){
    logger.log(Level.INFO, name + "开始审核数据");
    //审核
    ......
     logger.log(Level.INFO, name + "审核结束");
  }
}

    可以发现在代码中可能会出现很多logger.log。

使用Java代理改进

代理

public class LogProxy implements InvocationHandler{
  private Logger logger = Logger.getLogger(this.getClass().getName());
  private Object delegate;
  //绑定对象
  public Object bind(Object delegate){
  	this.delegate = delegate;
    return Proxy.newProxyInstance(delegate.getClass().getClassLoader, delegate.getClass().getInterface(), this);
  }
  //针对接口编程
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
    Object result = null;
    try{
      //在方法调用前后进行日志输出
      logger.log(Level.INFO, name + "开始审核数据");
      result = method.invoke(delegate, args);
      logger.log(Level.INFO, name + "审核结束");
    }catch (Exception e){
       logger.log(e);
    }
    return result;
  }
}

接口

public interface TimeBookInterface{
  public void doAuditing(String name);
}

实现

public class TimeBook{
  private Logger logger = Logger.getLogger(this.getClass().getName());
  //审核数据
  public void doAuditing(String name){
    //审核
    ......
  }
}

测试

public static void main(String[] args){
  //实现对日志类的重用
  LogProxy logProxy = new LogProxy();
  TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
  timeBookProxy.doAuditing("...");
}

AOP的关键概念

  • 切入点:对连接点进行拦截的定义
    • 静态切入点
    • 动态接入点
    • 自定义切入点
  • 通知
    • Interception Around
    • Before
    • After
    • Throw
    • Introduction
  • Advisor


JavaSpringAOP Share Tweet +1