Spring中AOP,一个query与check的…

   一个小担忧。AOP能一次性接管那么多query函数,会不会造成严重的性能下降呢?记得在windows装太多开发工具的话,启动每个程序它都潜在插个断点方便你调试,感觉每运行一个函数都会遇到一个地雷啊。
————————————————

  Spring的本质,是让对象与对象(模块与模块)之间的关系不通过代码来关联,而是通过配置类的说明来管理。(Spring根据这些配置内部通过反射去动态的组装对象)上升到框架层次,大部分已经属于管理学的范畴了。怎么管理这些程序(或者专业一点叫“事务”,因为这时候大多数程序不再是一个算法或者一个游戏,而是实实在在办一件事,如:签到盖章、工程审核),是软件工程重点关注的问题。
  AOP(Aspect Oriented Programming)面向切面的编程,提供另外一种思路:
  比如我们有个应用程序,每次在用户查询数据的时候,这个程序都进行一次权限检查,一般的思路是,给每一个查询function里,都加上一个check类。但是你每写一个查询function,都要加这么一个检查,非常繁琐:

  public List query(){
    check();
    //具体的查询代码
  }

  于是,我们需要换一种思路。把check函数分离开来,变成如下图的形式:
Spring中AOP,一个query与check的实现(一)
  就能把check进行分离。如图,所谓面向“切面”,就是指如图中,有无数多个对数据库的query(查询),这些query并行,平行组成了横向的“切面”,而由于check(数据库访问权限检查)是每个query都需要进行的,可以看作是一个纵向的“切面”,从这个切面一刀切下去,把check函数分离开来,独立了维护逻辑,简化了每次写query的代码量(少了check)。
  AOP(面向切面编程),可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后,去调用你指定的模块。在图示中就是在调用query方法前,先check一下用户的权限)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。
  Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务,进行内聚性的开发。
应用对象只实现它们应该做的功能来完成业务逻辑,仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如 日志事务支持
  讲了那么多概念,Spring是 如何实现AOP的呢?
  之前讲到,我要query前得check,其实就相当于在query前执行一遍check,那么问题就很简单了。因为Spring就相当于一个管理类工厂(Class Factory)的框架,那么我可以对工厂进行改造,每个出场的Object,我都给它的query方法套上一个check方法。类似这样:

void query(){
  check();
  super.query();
}
  哈哈,实现起来肯定不是那么简单。那么你如何获取check的呢?check方法肯定不是在这个类里面写的吧,于是你得从外部导入这个check方法:

public class CheckClass{
  void check(){
    //Todo something
  }
}
public class QueryClass{
  private CheckClass cc;
  QueryClass(CheckClass cc){
    this.cc=cc;   //在构造函数中传入外部CheckClass,而CheckClass里面定义好了check方法
  }
  void query(){
    cc.check();
    super.query();
  }
}

  所以,Spring的AOP过程大概帮我们做了这些事情。以后每遇到一个query方法,它就重新包装一遍,然后把我们自己写的包含check方法的类丢到里面,并重写query方法,在调用父类的query方法之前,调用我们给它写好的类的check方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值