spring AOP 를 이용 하여 사용자 작업 로 그 를 기록 하 는 방법 예시
최근 프로젝트 가 개발 되 었 으 나 사용자 작업 로 그 를 추가 해 야 한 다 는 것 을 발 견 했 습 니 다.다시 추가 하 는 것 도 현실 적 이지 않 으 므 로 springAOP 를 사용 하 는 것 이 적당 합 니 다.다음은 상세 한 소 개 를 살 펴 보 겠 습 니 다.
설명 도구 클래스:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAnnotation {
String operateModelNm() default "";
String operateFuncNm() default "";
String operateDescribe() default "";
}
절단면 종류:
@Aspect
public class MyInterceptor {
@Pointcut("execution(** com.luchao.spring.test3.service.impl.*.*(..))")
private void anyMethod(){}//
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println(name);
System.out.println(" ");
}
@AfterReturning("anyMethod()")
public void doAfter(){
System.out.println(" ");
}
@After("anyMethod()")
public void after(JoinPoint point){
System.out.println(" ");
}
@AfterThrowing("anyMethod()")
public void doAfterThrow(){
System.out.println(" ");
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
// System.out.println("classname:" + targetMethod.getDeclaringClass().getName());
// System.out.println("superclass:" + targetMethod.getDeclaringClass().getSuperclass().getName());
// System.out.println("isinterface:" + targetMethod.getDeclaringClass().isInterface());
// System.out.println("target:" + pjp.getTarget().getClass().getName());
// System.out.println("proxy:" + pjp.getThis().getClass().getName());
// System.out.println("method:" + targetMethod.getName());
Class[] parameterTypes = new Class[pjp.getArgs().length];
Object[] args = pjp.getArgs();
for(int i=0; i<args.length; i++) {
if(args[i] != null) {
parameterTypes[i] = args[i].getClass();
}else {
parameterTypes[i] = null;
}
}
//
String methodName = pjp.getSignature().getName();
Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes);
if(method.isAnnotationPresent(LogAnnotation.class)){
System.out.println(" 1");
}
// ,
Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());
if(realMethod.isAnnotationPresent(LogAnnotation.class)){
realMethod.getAnnotation(LogAnnotation.class).operateDescribe();
System.out.println(" 2");
}
System.out.println(" ");
Object object = pjp.proceed();//
System.out.println(" ");
return object;
}
}
설정 클래스:
@Configurable
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.luchao.spring.test3")
public class test3Config {
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Bean
public EncoreableIntroducer encoreableIntroducer(){
return new EncoreableIntroducer();
}
}
서비스 종류:
@Component
public class PersonServiceBean implements PersonServer {
/**
*
* @param name
*/
@LogAnnotation(operateModelNm = " ", operateFuncNm = " ")
public void save(String name) {
System.out.println(" save ");
}
/**
*
* @param name
* @param id
*/
public void update(String name, Integer id) {
System.out.println(" update() ");
}
/**
*
* @param id
* @return
*/
public String getPersonName(Integer id) {
System.out.println(" getPersonName() ");
return "xxx";
}
}
테스트 방법:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = test3Config.class)
public class SpringAOPTest {
@Autowired
private PersonServer personServer;
@Test
public void inteceptorTest(){
Encoreable encoreable = (Encoreable)personServer;
encoreable.performEncore();
personServer.save("test");
}
}
springAOP 절단면 에 서 는 프 록 시 를 사용 하기 때문에 프 록 시 대상 을 직접 얻 고 실제 대상 의 정 보 를 얻 을 수 없습니다.예 를 들 어 주석 등 입 니 다.
//
String methodName = pjp.getSignature().getName();
Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes);
실제 대상 을 얻 으 려 면 주해 의 정 보 를 얻 으 면 판단 기록 을 편리 하 게 할 수 있 습 니 다.
// ,
Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());
이렇게 해서 간단 한 조작 로그 기록 demo 를 완성 하 였 습 니 다.또한,어떤 방법 으로 절 점 을 설정 하지 않 으 면 ant 스타일 의 절 점 절 입 방식 으로 여러 개 또는 모든 방법 을 설정 할 수 있 습 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spring AOP 를 이용 하여 사용자 작업 로 그 를 기록 하 는 방법 예시절단면 종류: 설정 클래스: 서비스 종류: 테스트 방법: springAOP 절단면 에 서 는 프 록 시 를 사용 하기 때문에 프 록 시 대상 을 직접 얻 고 실제 대상 의 정 보 를 얻 을 수 없습니다.예 를 들 어...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.