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 스타일 의 절 점 절 입 방식 으로 여러 개 또는 모든 방법 을 설정 할 수 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기