SpringBoot 차단기 와 사용자 정의 주석 으로 데이터 차단 인 스 턴 스 를 진행 합 니 다.
=======================================================================
SpringBoot 차단기 와 사용자 정의 주석 으로 데이터 차단
절단면 스위치 설정:
spring.aop.auto: true spring.aop.proxy-target-class: true
1. 실현 코드 는 다음 과 같다.
제어 층
package com.xxx.product.admin.controller.stocks;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @ClassName StockRedisController
* @Description
* @Author zhangs
* @Date 2018 10 9 11:04:43
*/
@Controller
@RequestMapping("/stockRedis")
public class StockRedisController {
private static final Logger logger = LoggerFactory.getLogger(StockRedisController.class);
@StockAnnotation(modelName = "stockRedis", option = "test")
@RequestMapping("/test")
@ResponseBody
public String test(@RequestBody String param, HttpServletRequest request){
try {
logger.info(" 。。。。。"+param);
Thread.sleep(1000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.info(" 。。。。。"+param);
return "OK";
}
}
package com.xxx.common.stock.aop;
import java.lang.annotation.*;
//@Retention: ,
@Retention(RetentionPolicy.RUNTIME)// class ,
//@Target:
@Target({ElementType.METHOD,ElementType.PARAMETER})//
@Inherited//
@Documented// javadoc
public @interface StockAnnotation {
/**
*
*/
String modelName() default "";
/**
*
*/
String option();
}
package com.xxx.common.stock.interceptor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.xxx.common.stock.aop.StockAnnotation;
import com.xxx.common.utils.mapper.JsonMapper;
import com.xxx.product.stocks.domain.vo.StockPara;
import com.xxx.product.stocks.service.intf.StockService;
/**
* @ClassName StockUpdateAspect
* @Description
* @Author zhangs
* @Date 2018 10 26 3:17:49
*/
@Aspect //
@Component // ,i , 。ps: ,
public class StockUpdateAspect {
private static final Logger logger = LoggerFactory.getLogger(StockUpdateAspect.class);
@Autowired
private StockService stockService;
/**
* Pointcut,Pointcut , ,
*/
@Pointcut("@annotation(com.xxx.common.stock.aop.StockAnnotation)")
public void StockAspect (){
System.out.println(" ");
}
/**
*
* @param pjp
* @param stockAnnotation
* @return
* @throws Throwable
*/
@Around(value = "StockAspect() && @annotation(stockAnnotation)")
public Object doAround(ProceedingJoinPoint pjp, StockAnnotation stockAnnotation) throws Throwable {
Object result = null;
try {
logger.info(" >> Name:{} >> Option:{} >> param:{}",stockAnnotation.modelName(),stockAnnotation.option(),Arrays.toString(pjp.getArgs()));
// ,
//ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//HttpServletRequest request = attributes.getRequest();
//
/*logger.info("IP: {} >> URI: {} >> HTTP_METHOD: {} >> CLASS_METHOD: {} >> ARGS: {}",request.getRemoteAddr() ,request.getRequestURI(),request.getMethod(),
pjp.getSignature().getDeclaringTypeName() + "_" + pjp.getSignature().getName(),Arrays.toString(pjp.getArgs()));*/
result =pjp.proceed();
//
String data=JsonMapper.toJsonString(pjp.getArgs()[0]);
logger.info("ARGS 1:{}", data);
List stockList=new ArrayList();
StockPara stock=null;
String regex="(\"activeCode\":\"|\"goodsSid\":)(.*?)(\"|,|},|}|}]$)";//
Matcher matcher = Pattern.compile(regex).matcher(data);
while (matcher.find()) {
logger.info(" :{} >> :{} >> : {}",matcher.group(0),matcher.group(1),matcher.group(2));
stock=new StockPara();
String value=matcher.group(2);
if(!ObjectUtils.isEmpty(matcher.group(2))){
if(matcher.group(1).indexOf("activeCode")>0){
stock.setActiveCode(value);
}else if(matcher.group(1).indexOf("goodsSid")>0){
stock.setGoodsSid(Long.valueOf(value));
}
stockList.add(stock);
}
};
stockRedisService.synUpdateStockForRedis(stockList);
} catch (Exception e) {
// TODO: handle exception
logger.error(" >> :{} >> :{} >> :{}",stockAnnotation.modelName(),stockAnnotation.option(),e.toString());
}
return result;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.