JDK1.5에 소개 된 자바 주석, 스프링 프레임 워크는 그것의 머리에 자바 주석으로 발생합니다.
다음은 AOP (Aspect 지향적 인 프로그래밍) 개념 스프링 프레임을 포함하는 간단한 프로세스 봄 사용자 정의 주석을 설명합니다.
자바 주석이 명확하지 않습니다, 당신은 자바 사용자 정의 주석을 이해할 수 : 자바 사용자 정의 주석
첫째, 사용자 정의 주석을 만들
매개 변수의 requestUrl는 우리의 정의입니다
패키지 com.sam.annotation; 가져 java.lang.annotation의를 *. ; @Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) @Documented @Inherited 공공의 @의 인터페이스 이 mylog { 문자열 requestUrl (); }
둘째, 해결의 코멘트
AOP 스프링 여기에 사용되는 (지향 프로그래밍) 특성
클래스에 의해 @Aspect 코멘트는 클래스 섹션이 될
변형 된 방법이 mylog 주석이 주석 타입에 대한 지정된 엔트리 포인트이다 @MyLog @Pointcut 지정된 엔트리 포인트에 의해, 시작점을 입력한다.
- 조언을하기 전에 @Before : 조언은 가입 시점 이전에 실행되는하지만, (만약 예외를 던지지 않는다면)이 통지하기 전에 실행 흐름의 연결 지점을 중지 할 수 없습니다.
- 조언 주위 @Around : 전 동작이 구현되는 방법을 수행 할 수 후, 상기 방법은 () point.proceed 내에서 수행해야하고, 그 결과를 반환한다.
- 포스트 알림 @AfterReturning : 접속점 후에 실행 통지하면 정상 완료 : 예컨대, 예외, 통상 창을 던지고없는 방법.
- @AfterThrowing 예외 알림 : 예외가 종료 방법을 던져 때 조언을 실행할 수 있습니다.
- @After 포스트 통지 : 통지 할 때 실행하는 정상 완료의 접속점 : 예컨대, 예외, 통상 창을 던지고없는 방법.
패키지 com.sam.annotation; 수입 org.aspectj.lang.JoinPoint; 수입 에 org.aspectj.lang.ProceedingJoinPoint; 가져 org.aspectj.lang.annotation을 *. ; 수입 org.aspectj.lang.reflect.MethodSignature; 수입 org.springframework.stereotype.Component; 수입 java.lang.reflect.Method의; @Aspect // AOP切面 @Component 공공 클래스 MyLogAspect { // 切入点 @Pointcut (값 = "@annotation (com.sam.annotation.MyLog)" ) 개인 무효 포인트 컷 () { } / ** * 전과 메소드 실행 후 * * @param의 포인트 * @param 이 mylog * @return * / @Around (값 = "포인트 컷 () && @annotation (이 mylog)" ) 공중 주위 개체 (ProceedingJoinPoint 가리킨이 mylog이 mylog) { System.out에 .println는 ( "++++ 방법은 주위 수행 ++++" ) 문자열 requestUrl = myLog.requestUrl (); // 절편 클래스 이름 클래스를 clazz = point.getTarget () getClass (); // 절편 상기 방법 에있어서, 방법 = ((MethodSignature) point.getSignature ()) getMethod 메소드 (); 에서 System.out.println ( "실행 클래스 :"+ clazz에 + "방법 :"+ 방법 + "사용자 지정 요청 주소 :"+ requestUrl) 은 try { 반환 point.proceed (); // 집행 } 캐치 (Throwable의 )의 Throwable { Throwable.printStackTrace (); 반환 에 Throwable.getMessage (); } } / ** * 메소드 실행 * * @param joinpoint를 * @param 이 mylog * @param의 결과 * @return * / @AfterReturning를 (값"결과를"반환 = "포인트 컷 () && @annotation (이 mylog)" ) 공공 객체 afterReturning (joinpoint를 joinpoint를,이 mylog이 mylog, 개체 결과) { // ) HttpServletRequest의 요청 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes (). 대해 GetRequest (); // HttpSession이 세션 = request.getSession (); 에서 System.out.println ( "++++执行了afterReturning方法++++" ); 에서 System.out.println ( "执行结果:"+ 결과); 반환 결과를; 파라미터 : 전 * / (@AfterThrowing 값 "예"를 던지고 = = "포인트 컷 () && @annotation (이 mylog)" ) 공중 공극 afterThrowing (joinpoint를 joinpoint를,이 mylog이 mylog 예외 예) { 에서 System.out.println를 ( "+ +++执行了afterThrowing方法++++ " ); 에서 System.out.println ( "请求:"+ myLog.requestUrl () + "出现异常" ); } }
사용자 정의 주석의 셋째, 사용
컨트롤러에 직접 주석을 사용 @MyLog
패키지 com.sam.controller; 수입 com.sam.annotation.MyLog; 수입 org.springframework.web.bind.annotation.RequestMapping; 수입 org.springframework.web.bind.annotation.RequestMethod; 수입 org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping (값 = "/ 인덱스" ) 공용 클래스 인 IndexController { @MyLog (requestUrl = "/ 인덱스请求" ) @RequestMapping (방법 = RequestMethod.GET) 공용 문자열 인덱스 () { 창 "인덱스" ; } }
프로젝트, 방문 HTTP를 시작합니다 : // localhost를 : 8080 / 색인
결과
++++执行了around方法++++
执行了 类:class com.yfs.controller.IndexController 方法:public java.lang.String com.yfs.controller.IndexController.index() 自定义请求地址:/index请求
++++执行了afterReturning方法++++
执行结果:index
봄, 사용자 정의 주석을 구현 이상의 사용자 정의 작업을 수행해야하는 간단한 절차를 설명한, 당신은 클래스 내부의 섹션에서 프로그래밍 할 필요가있다.
출처 : HTTPS : //my.oschina.net/magicalSam/blog/1359369