Spring - AOP 원리 초기 탐색 (당신 의 Spring 프로젝트 에 통 일 된 로 그 를 추가 합 니 다)

4299 단어 Spring
우선, AOP 는 일종 의 프로 그래 밍 모델 로 일종 의 사상 으로 통용 논 리 를 업무 논리 에서 분리 하고 중복 코드 를 너무 많이 쓰 지 않 기 위 한 것 이다.
이렇게 하 는 장점 은 1. 특정한 관심 사 를 집중 적 으로 처리 할 수 있다 는 것 이다.2. 삭제 관심 사 를 편리 하 게 추가 할 수 있 습 니 다.3. 코드 의 가 독성 을 강화 하여 유지 보수 에 더욱 편리 함
그 는 다음 과 같은 몇 가지 응용 장면 이 있다. 1. 권한 제어 (사용자 로그 인, 사용자 권한 호출 가능 한 인터페이스 등).2. 캐 시 제어;3. 사무 제어;4. 감사 일지;5. 성능 모니터링;6. 분포 식 추적;7. 예외 처리
springboot 프로젝트 에서 AOP 모드 로 로 그 를 추가 하 는 두 가지 방법 을 공유 합 니 다.
첫 번 째 이용 @ Aspect 주석:
/**
 * AOP  (@Aspect                   )
 *
 * @Author: liangxiao
 * @Date: Created in 0:41 2018/5/25
 */
@Aspect
@Component
public class HttpAspect {

    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);

    @Pointcut("execution(public * com.liangxiao.demo.controller.GirlController.*(..))")
    public void log() {
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //url
        logger.info("url={}", request.getRequestURL());

        //method
        logger.info("method={}", request.getMethod());

        //ip
        logger.info("ip={}", request.getRemoteAddr());

        //   
        logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());

        //  
        logger.info("args={}", joinPoint.getArgs());

    }

    @After("log()")
    public void doAfter() {
        logger.info("2222222222222222222");
    }

    @AfterReturning(returning = "object",pointcut = "log()")
    public void doAfterReturning(Object object){
        logger.info("response={}",object.toString());
    }
}

두 번 째 Handler Interceptor 인 터 페 이 스 를 실현 하고 해당 하 는 방법 을 다시 작성 합 니 다.
/**
 *      
 *
 * @author:liangxiao
 * @date:2018/6/7
 */
@Component
public class LogInterceptor implements HandlerInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class.getName());
    @Autowired
    protected RequestLogger requestLogger;

    public static final String ANALYSIS_STRING = "@@ANALYSIS@@";

    public static final String REQUEST_START_TIMESTAMP = "start_time";

    private static final String ATTRIBUTE_HTTP_COST = "cost";

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute(REQUEST_START_TIMESTAMP,
                System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        Object name = request.getAttribute(ConstantUtil.REQUEST_CATEGORY);
        if (name == null) {
            return;
        }
        long cost = System.currentTimeMillis() - (Long) request.getAttribute(REQUEST_START_TIMESTAMP);
        request.setAttribute(ATTRIBUTE_HTTP_COST, cost);

        //vaquero log
        LOGGER.info(ANALYSIS_STRING + " " + name + ".cost=" + cost + "ms");
        //analyzer log
        requestLogger.log((String) name, request, response);
    }
}

이것 은 WebMvcConfigurerAdapter 로 설정 해 야 합 니 다. 설정 클래스 는 다음 과 같 습 니 다.
/**
 *      
 * @author:liangxiao
 * @date:2018/6/7
 */
@Configuration
@EnableWebMvc
public class InterceptorConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private LogInterceptor logInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor).addPathPatterns("/**");
    }
}

예 를 들 어 저 는 Spring 의 AOP 에 대해 초보적인 사용, 더 나 은 우열 대비 와 원 리 를 가지 고 있 을 뿐 입 니 다. 저 는 후속 적 인 학습 과 사용 에서 후속 적 인 블 로그 에 계속 추가 할 것 입 니 다 ~

좋은 웹페이지 즐겨찾기