春@Cacheable同じクラスの呼び出しにコメント&&総務@Transactional方法は有効になりません。

オブジェクト呼び出し内部@Cacheableノートは有効になりません。

コード例:
ProductServiceImpl.java

  公共の一覧<ProductInfoVO> getProductList(CommonRequest <ProductInfoDTO> reqest){
    // @Cacheable失效、不会走缓存的
    戻る  この.findProductInfoList(reqestを)。
  } 
  
  @Cacheable(cacheNames = "productInfos"、のCacheManager = "jfinetchRedisCacheManager"、キー= " 'JBS:製品:リスト:'。CONCAT(#reqest.getChannelCode())" 公共一覧<ProductInfoVO> findProductInfoList(CommonRequest <ProductInfoDTO> reqest){ 
      リスト <ProductInfoVO> redisList = productService.findList(reqest)。
      redisList。= redisList.stream()(それをフィルタリングします- >。。ProductStatusEnum.OPEN.getCode()に等しい(it.getStatus())))((Collectors.toList)を集めます。

      返すredisListを。
  }
  

この時点で、それが力にない@CacheableキャッシュをコメントfindProductInfoList呼び出すgetProductList。

 

 

 

 

理由:
春の注釈ベースのSpring AOPキャッシュ部は、この方法は、代理店を歩くので、注釈が有効になりませんなしで注釈を付け内部キャッシュであるときに呼び出さ親クラスまたはサブクラスを呼び出すために、有効にするには、同じコールを代行を取る必要があります。

 

@Transactional業務のばねの力に入るための前提条件は、インターセプタのTransactionInterceptorの結果であり、それだけAdvisedSupport.getInterceptorsAndDynamicInterceptionAdviceに、見ることができるソースコードを表示するスプリングと、スプリングする方法TransactionInterceptorインターセプタトランザクション管理によるメソッド呼び出しの前に追加されると言うことですノートは、トランザクションがそれ以外の場合は無効、有効になっている場合@Transactionalメソッドは、呼び出しメソッドからノートを取得します。

このメソッドは、クラスAOP CglibAopProxyによる内部クラスDynamicAdvisedInterceptorコールのばねであり、そしてDynamicAdvisedInterceptorは、メソッド呼び出しをインターセプトし、呼び出しチェーンを得るために、MethodInterceptorのを継承しました。

 

このメソッドは、クラスAOP CglibAopProxyによる内部クラスDynamicAdvisedInterceptorコールのばねであり、そしてDynamicAdvisedInterceptorは、メソッド呼び出しをインターセプトし、呼び出しチェーンを得るために、MethodInterceptorのを継承しました。

トランザクション注釈春のトランザクション管理が提供されます。

それを私たちの世代の各クラスのプロキシオブジェクトをビーン管理やスライスを達成するために強調、スプリング動的プロキシ(AOP)。場合にのみ、ロジック部をトリガすることができますプロキシオブジェクト間のコール。
同じクラスでは、プロセスBは方法Aを呼び出し、メソッド呼び出しは、プロキシオブジェクトを通過することなく、本来の目的です。春は、この呼び出しにカットすることはできませんので、我々は、アノテーションによってトランザクションを保証することはできません。
言い換えれば、と呼ばれるクラスと同じように、傍受するメソッドのインターセプタではありませんので、トランザクションは動作しません。

 

ソリューション

1.方法は、プロキシクラスを通して導入される別のクラスの中に引き込ま別々 removeGroupUserStatusCachedができます。
2で得られた((GroupUserService)AopContext.currentProxy()) removeGroupUserStatusCached 現在のクラスのプロキシクラスメソッド;.
現在のクラスのApplicationContext、GroupUserService groupUserService = springContextUtil.getBean(GroupUserService.classのプロキシオブジェクトを介して3アクセス )。

この方法は、別のクラスに入れ、注射によるクラススプリング、すなわち、呼び出しオブジェクト間の条件を満たすことができます。

このオブジェクトのプロキシオブジェクトを取得した後、電話をかけます。次のような特定の操作
  構成増加春content.xmlコンテキストは、:<AOP AspectJの-オートプロキシは、公開 / = "true"を-proxy>
xxxServiceImplにおいて、(xxxService)(AopContext.currentProxy())で処理し 、 取得したxxxServiceプロキシクラス、その後、総務課を活性化、プロキシクラスを介して強制的に取引方法を、呼び出します。

おすすめ

転載: www.cnblogs.com/panchanggui/p/11512388.html