• 小仙
    2021-07-15
    如果在类的 method 上增加 @Cacheable 等相关的缓存注解, 1.Spring 如何判断该 bean 上有这些注解,每个 bean 的初始化过程都会判断吗? 2.这个判断是通过 postProcess 相关的生命周期来进行的吗? 3.如果判断成功,spring bean 会被替换为 proxy 代理对象,当框架通过 getBean 实际上获取的是 proxy 对象?

    作者回复: 1. 如果 SpringIoC 容器添加了 AbstractAutoProxyCreator 的 Bean 的话,几乎所有的 Bean(除了有些加载更早 Spring 内建的 Bean)在早期实例引用或初始化对象时都去判断其方法上有 Caching 相关的注解,如有有的话,那么该方法则是一个切面,会对应 Caching 相关的 Advice。 2. 这个需要考虑两种情况,其一如果代理对象是基于 CGLib 提升的话,那么代理类是原 Bean 类的子类,所以当 Bean 被包装(替换)成代理 Bean 后,其类型结构保持了原 Bean 的,所以该有的生命周期回调还是会按照之前的方式进行。如果代理对象是基于 JDK 动态代理的话,那么,代理对象会动态地实现其原 Bean 类中的接口,所以当 Bean 被包装为代理对象时,它仍旧实现了相关生命周期接口,当生命周期接口方法被执行时,实际调用的是原 Bean 对象方法。 3. 如果判断成功,spring bean 会被替换为 proxy 代理对象,当框架通过 getBean 实际上获取的是 proxy 对象。

    共 3 条评论
    2
  • 姑射仙人
    2021-09-19
    AutoProxyRegistrar应该是被放在某个@Enable**的@Import中,然后才能拿到具体的AutoProxyCreator,然后去自动注册。问题时我没找到谁标注了它。只是CachingConfigurationSelector中被注册到Spring中,这是怎么个实现原理?

    作者回复: 注册的是AutoProxyCreator 的子类,Caching 有独立的注解 @EnableCaching

    共 2 条评论
    