AOP 나는 모두가 매우 분명하다고 생각합니다. 때로는 요청 로그를 처리하거나 일부 방법을 모니터링해야하며 예외가있는 경우 무엇을 처리해야합니까? 이제 스프링 부츠에서 AOP를 소개합니다.
[개발 환경 : JDK 버전 번호는 1.8, Spring입니다
부팅의 버전 번호는 1.4.1] {style =”Background-Color :#ff0000”}
먼저 JAR 패키지를 먼저 소개합니다.
POM 파일은 다음과 같이 추가됩니다.
<!-CITE AOP-> <pectionency> <groupId> org.springframework.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-Aop </artifactid> </fectionency> <!-인쇄를 위해 gson, <pection> <groupid> com.google.code.gson <artifactid> gson> gson> gson> gson <버전> 2.7 </version> </fectionency>
JAR 패키지를 소개 한 후 시작을 부팅하기 위해 두 가지 간단한 요청 처리 방법을 추가합니다.
@SpringBootApplication (scanbasepackages = { "com"})@restControllerPublic 클래스 DemoApplication {public static void main (String [] args) {springApplication.run (demoapplication.class, args); } // 인수없이 GET 요청 테스트 @RequestMapping (value = "/testAspect", method = requestMethod.get) public uservo test () {uservo uservo = new uservo (); uservo.setage ( "23"); uservo.setName ( "He Xiaowu"); uservo.setsex ( "male"); Return uservo; } // 매개 변수로 GET 요청을 테스트하고 AOP 매개 변수 컨텐츠를 인쇄하자 @RequestMapping (value = "/testAspectargs", Method = requestMethod.get) public uservo test (문자열 이름, 문자열 연령, 문자열 섹스) {uservo uservo = new uservo (); uservo.setName (이름); uservo.setage (나이); uservo.setsex (섹스); Return uservo; }두 가지 간단한 요청 처리 방법을 추가 한 후 AOP를 추가하겠습니다.
/** * 프로젝트 이름 : SpringBootdemo * Creator : He Xiaowu * Creation Time : 16/12/4 7:05 PM * 클래스 이름 : AspectDemo * 클래스 설명 : * /// Section@Section@Spegh Managed Bean@Component@Order (1) Public Logger Logger.GetLog (GetClass (GetClass)); Private GSON GSON = NEW GSON (); // 실행 표현식 @pointcut에서 점을 선언합니다 @pointcut ( "execution (public * com.example.demoApplication. * (..))") private void controlLeraspect () {} // 메소드를 요청하기 전에 컨텐츠를 인쇄하기 전에 (value = "controllerAspect ()") public void methodbefore (joppointtattatttatttatttatttattatttatttatttatttatttatttatttibutes를 요청합니다. (servletRequestAttributes) requestContexTholder.getRequestAttributes (); httpservletrequest 요청 = requestAttributes.getRequest (); // 요청 내용을 인쇄합니다 log.info ( "======================================================== ======================================================================== ======================================================================== =========================================================================== ======================================================================== =========================================================================== ======================================================================== =========================================================================== // 메소드가 실행 된 후 반환 내용 인쇄 @AfTerReturning (returning = "o", pointCut = "ControlLerAspect ()") public void methodFterReturning (Object O) { log.info("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.두 사람이 구성된 후 인쇄 로그를 요청한 다음 봅니다. 먼저 컨테이너를 시작한 다음 먼저 매개 변수화 처리 방법을 요청합니다. 인쇄 로그는 다음과 같습니다.
{width =”1232”
높이 =”132”}
요청 된 URL, 메소드, ARGS 매개 변수 값, 유형 및 반환 된 컨텐츠가 모두 인쇄되어 AOP 인터셉트가 성공적으로 인쇄된다는 것을 알 수 있습니다.
다음으로 매개 변수없이 요청 처리 방법을 테스트하고 로그를 다음과 같이 인쇄합니다.
{width =”1100”
높이 =”130”}
이 메소드에서 인쇄 된 메소드 매개 변수는 메소드가 매개 변수 전달이 필요하지 않기 때문에 빈 배열이라는 것을 알 수 있습니다.
위의 것은 웹 프로세싱의 로그 처리를위한 SpringBoot 참조 AOP입니다. 다음은 AOP 섹션의 주요 주석입니다. 다음은 주석의 설명과 사용입니다. 저자는 그것들을 자세히 테스트하지 않습니다. 관심이 있으시면 직접 테스트 할 수 있습니다.
수업 주석 :
@aspect 클래스를 측면 클래스로 정의합니다
@Order (i)는 패싯 클래스의 처리 우선 순위를 표시합니다. I 가치가 작을수록 우선 순위가 높아집니다. 추신 : 클래스에 주석을 달거나 메소드에 주석을 달 수 있습니다.
메소드 주석 :
@PointCut 방법을 표현으로 포인트 컷으로 정의합니다.
@before는 탄젠트 지점 전에 메소드를 실행하면 내용이 지정된 탄젠트 지점입니다.
@After는 Point Cut 이후에 실행됩니다.
@afterreturning은 진입 점과 반환 후에 실행됩니다. 일부 메소드의 리턴 매개 변수를 처리하려면 여기에서 작동 할 수 있습니다.
@around는 탄젠트 지점을 둘러싸고 탄젠트 지점에 들어가기 전에 실행하고 접선 지점 이후에 실행됩니다.
@AfterThrowing은 처리를위한 슬릿 포인트 후 예외를 던졌습니다
@Order (i)는 포인트 컷의 우선 순위를 표시합니다. i가 작을수록 우선 순위가 높아집니다
@PointCut 주석 조합 :
위의 코드에서는 지정된 경로 만 처리하는 탄젠트 지점을 정의합니다.
@PointCut ( "execution (public * com.example.demoApplication. * (..))") private void controlLeraspect () {}이제 우리는 다른 경로를 처리하기 위해 접선을 정의하고 있습니다.
@PointCut ( "Execution (public*com.demo.*.*(..))") private void controllerdemo () {}위의 접선 지점은 모두 별도로 처리됩니다. 두 가지를 처리하기 위해 탄젠트 지점이 필요한 경우 다음과 같이 구성 할 수 있습니다.
@PointCut (value = "ControlLerAspect () || ControlerDemo ()") private void all () {} @pointcut 주석에서 @pointcut에 의해 주석이 붙은 다른 메소드 이름을 직접 참조하여 포인트 컷이 두 경로에서 메소드를 처리 할 수 있습니다.
@PointCut 주석 실행 실행 표현 : public*com.demo.*.*(..)
메소드를 나타내는 첫 번째 공개 수정자는 첫 번째 * 대신 *를 사용할 수 있으며 *는 반환 값을 나타내며 *는 모두를 나타냅니다.
com.demo.* 패키지 경로,.* 경로의 세 번째 패키지를 나타냅니다.*는 경로 아래의 모든 패키지에서 모든 클래스의 방법을 나타냅니다.
(..)는 무제한 메소드 매개 변수를 의미합니다
@Order (i) 주석에 대한 몇 가지 메모 :
주석 클래스는 값이 작을수록 우선 순위가 높을수록, 주석 방법이 높을수록, 두 개의 주석이 주석이 달라집니다. @beforeforforforforfer 우선 순위가 작을수록 우선 순위가 높을수록 우선 순위가 높을수록 @After 또는 @AfterReturning이 높을수록 I 값이 커질수록 우선 순위가 높아집니다.
두 가지를 요약하기 위해 다음과 같습니다.
진입 점 전 작업에서, 진입 점 후의 작업은 작은 내지 크게 순서 값에 의해 수행되며, 진입 점 후 작동은 크게에서 작은 것부터 주문 값에 의해 수행됩니다.
연장하다:
일부 독자는 들어오는 및 종료에서 요청에 필요한 시간을 인쇄하고 시간을 계산하기 위해 멤버 변수를 정의하고 @before 및 @AfterReturning 액세스를 제공하면 동기화 문제가있을 수 있습니다. 따라서 우리는 일반 유형을 지정하는 ThreadLocal 객체를 나타냅니다. @Before에서 요청을 녹음하고 @AfterReturning에서 레코드를 공제하는 시간은 소비 된 시간입니다. 코드는 다음과 같습니다.
/** * 프로젝트 이름 : SpringBootdemo * Creator : He Xiaowu * Creation Time : 16/12/4 7:05 PM * 클래스 이름 : Aspectdemo * 클래스 설명 : * /// 선언은 Section@Spect // 선언문입니다. Private GSON GSON = NEW GSON (); ThreadLocal <long> starttime = new ThreadLocal <long> (); // 실행 표현식 @pointcut에서 점을 선언합니다 @pointcut ( "execution (public * com.example.demoApplication. * (..))") private void controlLeraspect () {} // 메소드를 요청하기 전에 컨텐츠를 인쇄하기 전에 (value = "controllerAspect ()") public void methodbefore (startPoint.set) (system.current.set); servletrequestattributes requestAttributes = (servletRequestAttributes) requestContexTholder.getRequestAttributes (); httpservletrequest 요청 = requestAttributes.getRequest (); // 요청 내용을 인쇄합니다 log.info ( "========================================================================================================================= ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== arrays.tostring (joinpoint.getargs ()); log.info ( "======================================================================================================================================= arrays.tostring (joinpoint.getargs ()); log.info ( "응답 내용 :" + gson.tojson (o)); log.info("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------위는 내 테스트에서 얻은 모든 결과입니다. 차이 나 오류가있을 수 있습니다. 저를 수정 해주세요.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.