Spring - AOP 원리 초기 탐색 (당신 의 Spring 프로젝트 에 통 일 된 로 그 를 추가 합 니 다)
4299 단어 Spring
이렇게 하 는 장점 은 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 에 대해 초보적인 사용, 더 나 은 우열 대비 와 원 리 를 가지 고 있 을 뿐 입 니 다. 저 는 후속 적 인 학습 과 사용 에서 후속 적 인 블 로그 에 계속 추가 할 것 입 니 다 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.