같은 클래스 호출 봄 @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.

 

 

 

 

그 이유는
이 방법이 더 주석이없는 내부 캐시가 기관을 산책 할 때 주석이 적용되지 않도록 스프링 주석 기반의 스프링 AOP 캐시 섹션라는 부모 클래스 또는 서브 클래스를 호출을 적용하려면 동일한 전화를 기관을해야합니다.

 

@Transactional 업무의 봄의 발효를위한 전제 조건은 인터셉터에 TransactionInterceptor의 결과, 즉 단지 AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice에서 볼 수있는 소스 코드를 볼 봄, 봄하는 방법에 TransactionInterceptor 요격 트랜잭션 관리에 의해 메소드 호출하기 전에 추가됩니다 말을하는 것입니다 호출 방법에서 메모를 얻을 것이다 @Transactional 방법, 노트 경우, 트랜잭션, 그렇지 않으면 비활성화를 사용할 수 있습니다.

이 메소드는 클래스에 의해 AOP CglibAopProxy 내부 클래스 DynamicAdvisedInterceptor 호출의 스프링이며, DynamicAdvisedInterceptor 메소드 호출을 인터셉트 및 호출 체인을 수득 상속의 MethodInterceptor.

 

이 메소드는 클래스에 의해 AOP CglibAopProxy 내부 클래스 DynamicAdvisedInterceptor 호출의 스프링이며, DynamicAdvisedInterceptor 메소드 호출을 인터셉트 및 호출 체인을 수득 상속의 MethodInterceptor.

트랜잭션 주석 Spring 트랜잭션 관리를 제공한다.

강조, 봄 동적 프록시 (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