zoukankan      html  css  js  c++  java
  • 多租户技术实现:Hibernate + AOP

    Hibernate Filter

    Hibernate Filter过滤特定租户ID的数据,实现共享表级别的数据隔离;

    提取出Filter的代码,通过AOP方式(Spring集成)作用于特定方法中;

    Filter只能作用于查询集合,对单个查找(比如通过主键)是不起作用的,因为这是没有意义的。

    Filter的定义包括两个部分,名字,参数(参数类型的值都是小写字母):

    <filter-def name="Filter名字">

        <filter-param name="参数名" type="参数类型(string, integer, long)"/>

    </filter-def>

    Filter的使用声明也包括两个部分,名字,过滤条件:

    <filter name=" Filter名字" condition="where子句 "/>

    比如:

    salary > :amount

    name like :name

    :asOfDate BETWEEN eff_start_dt and eff_end_dt

    :参数名是参数,其它是数据库的字段名

    Hibernate把Filter的作用范围设计为org.hibernate.Session内,所以一般通过Session对象获取Filter,然后设置过滤条件。

    Session的API:

    Filter enableFilter(String  filterName)

    Filter getEnabledFilter(String  filterName)

    void disableFilter(String  filterName)

    数据过滤代码,就一行:

    session. enableFilter(filterName).setParameter(String name, Object value)

    回过头并从整体来看才发现,原来filter的思想很简单:就是一个过滤条件,但在Java里的实现却很啰嗦、繁琐,主要是因为Java有一个核心的设计思想:可膨胀性。是的,你没有看错,可膨胀性的作用是使得“一个人写的代码”与“十个人写的代码”没有分别,“十个人写的代码”与“一百个人写的代码”没有分别,怎么做到的?因为设计时就是按照“一百人的流水线”这个规模来做的。然后所有Java相关的框架都继承了这个思想,结果就是出现大量的中间层。

    就Hibernate Filter而言,Filter名字、参数名都是中间层。假设能够这样做会不会更好呢:

    session. setFilter(“where子句”).setParameters(Object[] values)

     

    AOP(Spring集成)

    AOP的作用是把Filter部分的代码放在其它一些方法之前执行。接下来先写一个Before advice,把Filter部分的代码放进去:

    @Before("pointcut expression")

      public void setFilter() {

        session. enableFilter(filterName).setParameter(String name, Object value)

      }

    所谓的advice也就是一个方法,pointcut expression是方法的路径表达式(可以使用通配符:*),意思就是先调用这个所谓的advice方法,然后再调用pointcut指定的那些方法。

    AOP是Java的又一大特色,对于Lisp这类具有函数式编程范式的语言来说,这是编程语言最基本的思想:函数(方法)也是一种数据类型,可以作为参数和返回值。

    从方法调用的角度看就是:setFilter () -> method()。如果Java中方法能作为参数的话,就会变成这样:

    void aop(before, method, after) {

        before();

        method();

        after();

    }

    所以的AOP的核心就是模拟把方法作为参数

  • 相关阅读:
    10分钟学会SpringBoot入门
    单链表常见的4道笔试题(Java版)
    Java面试、跳槽必刷200+真面试题,让你披荆斩棘走进大厂
    金三银四JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
    最新整理的spring面试题从基础到高级,干货满满
    面试阿里百分百问的Jvm,别问有没有必要学,真的很有必要朋友
    面试官:你们前后端分离的接口规范是什么?
    “金九银十”已过,总结我的天猫、蚂蚁、头条面试经历(Java岗)
    350道面试题分享,拿下京东offer工资double
    2019大厂Java岗面试题全曝光,刷完这1020道,金三银四大厂等你
  • 原文地址:https://www.cnblogs.com/huangyp/p/3653563.html
Copyright © 2011-2022 走看看