dao设计(三),缓存AOP拦截处理的几个思考

当我们发现我们可以用事件通知的方式来巧妙的实现缓存更新时,接下来需要考虑的就是如何用aop拦截方法并设置一些常量配置的问题了。


1. 首先考虑一个问题,例如每个DO实体对应key及缓存时间等配置我们是在启动初始化时全部设置好呢?还是在启动后动态设置? 个人认为,数量小可以在初始化设置,当量比较大或者在运行时很好获取时,运行时获取也是一个不错的选择。在此次缓存框架缓存配置信息我们采用了运行时设置,因为后续可以方便的实时获取并绑定到dao中。

2. 配置信息如何存放?由于配置信息是与DO实体对应的,最优雅的做法就是用注解了,我们关心的配置如下:

配置参数参数意义
cacheTime缓存时间
cacheObjectKey缓存key

在对应的DO类上加上@Table(objCacheTime = xxxx)即可

3. aop拦截到dao层调用方法后,我们仅仅知道方法参数,方法名和返回值,具体的DO实体我们并不知道,要实现获取DO实体类的功能,虽然可以要求所有的dao都以DO实体+Dao字符串的方式实现,但并不友好,可以采用泛型类, XxDaoCacheImpl extends DomainObjectDaoCacheBase这样就可以很方便的获取了具体的DO类,并通过DO类获取上面的注解信息。

4. 配置信息获取后,后续也可能会有需要的地方,由于spring实例化一般是单例的,对于哪些不变的信息,我们可以直接设置为dao的一个变量,第一次获取后就直接赋值。如上面提到的配置,由于当前的MethodInvocation对象后续也会有用到的地方,由于参数等信息不同太多,则可以放到ThreadLocal中。

5. 对于之前提到缓存事件通知,cacheManager是与具体的dao绑定的,在aop拦截到查询方法时,如果没有设置绑定,则我们要根据@Event注解设置对应要绑定关系,Map<String, Set<String>>,key为dao+事件类型,value为方法和参数名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring 循环依赖通常出现在两个或多个 Bean 之间相互依赖的情况下。例如,Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A,这就形成了循环依赖。Spring 通过缓存的方式来解决循环依赖的问题。 缓存是 Spring 中用于存储单例对象的一个数据结构,它包括了个 Map,分别是 singletonObjects、earlySingletonObjects 和 singletonFactories。其中,singletonObjects 存储已经完全创建好的单例对象,earlySingletonObjects 存储被提前暴露出来但是还没有完全创建好的单例对象,singletonFactories 存储用于创建单例对象的工厂方法。 在创建 Bean 的过程中,Spring 首先通过 singletonObjects 缓存查找已经创建好的单例对象,如果找到了就直接返回,否则继续往下执行。如果 Bean 正在创建中,就从 earlySingletonObjects 缓存中获取未完全创建好的 Bean 实例。如果还没有找到,就从 singletonFactories 缓存中获取用于创建 Bean 实例的工厂方法。 在 AOP 中,Spring 会使用代理对象来包装原始对象,从而实现切面的功能。如果一个 Bean 既被代理了又依赖于其他 Bean,就会出现循环依赖的问题。为了解决这个问题,Spring 引入了 AOP 提前暴露代理对象的功能,即通过将代理对象放入 earlySingletonObjects 缓存中,使得被代理的 Bean 可以提前获取代理对象而不是原始对象。 总之,Spring 的缓存AOP 提前暴露代理对象功能都是为了解决循环依赖问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值