머리말
AOP는 측면 지향 프로그래밍의 약어입니다. 객체 지향 프로그래밍과 반대되는 개념입니다. 객체 지향 프로그래밍에서 캡슐화, 상속 및 다형성과 같은 개념을 채택하여 객체에서 각 함수를 구현하는 경향이 있습니다. 그러나 실제 상황에서는 많은 객체의 많은 방법에서 함수 유형이 필요하다는 또 다른 요구 사항이 있음을 발견했습니다. 예를 들어, 일부 데이터베이스 액세스 방법에는 트랜잭션 관리 요구 사항이 있으며 많은 방법으로 인쇄 로그가 필요합니다. 객체 지향적 인 방식으로, 이러한 동일한 기능은 여러 곳에서 구현되거나 여러 곳에서 호출되어야합니다. 이것은 매우 번거롭고 이러한 비즈니스 독립적 요구 사항과 너무 밀접하게 연결되어 있습니다. 나중에, 측면 지향 프로그래밍은 이러한 유형의 문제를 해결하는 것처럼 보였고 객체 지향 프로그래밍에 좋은 보충제를 만들었습니다.
개념
탄젠트 지향 프로그래밍을 잘 이해하려면 먼저 AOP의 개념을 이해해야합니다. Java에서 SageJ는 AOP의 기능을 비교적 완전한 방식으로 구현하지만 사용하기에 더 복잡하므로 주로 Spring의 AOP를 논의하는 것이 있습니다. Spring AOP는 AOP의 핵심 기능을 실현하기 위해 단순성과 적절성의 원칙을 채택합니다. 먼저 AOP의 특정 개념에 대해 이야기 해 봅시다
Sprinboot AOP 구현
SpringBoot의 기본 사용을 설명하기 위해 여러 장을 사용했습니다. 따라서 SpringBoot 및 AOP를 사용하여 모든 REST 인터페이스 입력 매개 변수 및 리턴 매개 변수 로그를 출력하는 함수를 구현합니다.
나머지 서비스 기능을 구현하십시오.
이전 기사에 따르면, 우리는 먼저 다음 그림과 같이 스프링 부츠 프로젝트를 구축 할 것입니다.
데모 프로젝트
SpringBoot 프로젝트 구성
SpringBoot 프로젝트를 다음과 같이 구성합니다
서버 : 포트 : 3030 서플릿 : Context-Path : /AOP-Demospring : Jackson : Date-Format : Yyyy-MM-DD HH : MM : SS 직렬화 : 인트닝 출력 : Truelogging : Level : Com.Yanggch : Debug
Jackson 관련 구성은 객체를 JSON 문자열로 출력하고 출력을 형식화하는 것입니다.
REST 인터페이스를 구현하는 컨트롤러 클래스
여기서 우리는 두 개의 REST 인터페이스를 구현합니다. 하나는 Hello Information을 반환하는 것입니다. 하나는 입력에 따라 로그인 정보를 반환하는 것입니다.
package com.yanggch.demo.aop.web; import com.yanggch.demo.aop.aop.domain.loginentity; import com.yanggch.demo.aop.domain.securityentity; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestbody; import org.springframework.web.bind.annotation.requestmapping; import org.sprameframework.web.bind.annotation.requestmethod; import org.springframework.bind.bind.restcontololler; java.util.date;/*** 보안 관련 휴식 서비스*** @Author : Yang Gaochao* @since : 2018-05-27*/ @restController @restontroller @restontroller @restontroller @restontroller @ 로그인 (@requestbody loginentity loginentity, @pathvariable long shopid) {securityentity securityentity = new Securityentity (); Security.setShopid (shopid); Security.setAccount (loginentity.getAccount ()); Security.setpwd (loginentity.getpwd ()); Security.setLogIntime (새 날짜 ()); 반환 안보; } @requestmapping (value = "/echo/{name}", method = requestMethod.get) public String Login (@PathVariable String name) {return "hello," + name; }}먼저 입력 매개 변수를 출력하고 모든 REST 인터페이스의 결과를 AOP 함수를 통해 로그로 반환하려고합니다.
웹 AOP 기능을 구현하십시오.
package com.yanggch.demo.aop.comment; import com.fasterxml.jackson.databind.objectmapper; import org.aspectj.lang.lang.joinpoint; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.beactj.lang.lang.annot.annot org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.spramframework.stereotyp.component; import org.spramframework.web.multipartfile; 수입 Javax.servlet.http.httpervletrequest; import javax.servlet.http.htttp.httpservletrepresponse;/*** 웹 인터페이스 로그** @author : yang gaochao* @since : 2018-05-27*/ @and @componentpublic logger log = loggerfactory.getLogger (weblogaspect.class); 개인 최종 ObjectMapper Mapper; @autowired public weblogaspect (ObjectMapper Mapper) {this.mapper = mapper; } @PointCut ( " @annotation (org.springframework.web.bind.annotation.requestmapping)") public void weblog () {} @before ( "weblog ()") public void dobefore (join point) {객체 인스턴스 인스턴스 인스턴스 인스턴스 {virtartfile | | | httpservletrequest || httpservletresponse의 객체 인스턴스) {계속; } try {if (log.isdebugenabled ()) {log.debug (joinpoint.getTarget (). getClass (). getName () + "." + joinPoint.getSignature (). getName () + ":" + mapper.writeValueAsString (Object)); }} catch (예외 e) {e.printstacktrace (); }}} @afterreturning (returning = "response", pointcut = "weblog ()") public void doafterreturning (객체 응답) 던질 수있는 {if (response! = null) {log.debug ( "응답 매개 변수 :" + mapper.writeValueAsString (응답)); }}}주의를 기울여야 할 몇 가지 사항이 있습니다.
시험
포 그라운드에서 요청은 우체부를 통해 시작되며 백그라운드 로그 입력 결과는 다음과 같습니다.
2018-05-27 19 : 58 : 42.941 디버그 86072 --- [NIO-3030-Exec-4] c.yanggch.demo.aop.comment.weblogaspect : com.yanggch.demo.aop.web.security.login : 요청 매개 변수 : {
"계정": "Yanggch",
"PWD": "123456"
}
2018-05-27 19 : 58 : 42.941 디버그 86072 --- [NIO-3030-Exec-4] c.yanggch.demo.aop.comment.weblogaspect : com.yanggch.demo.aop.web.security.login : 요청 매개 변수 : 2001
2018-05-27 19 : 58 : 42.942 디버그 86072 --- [NIO-3030-Exec-4] c.yanggch.demo.aop.comment.weblogaspect : 응답 매개 변수 : {
"Shopid": 2001,
"계정": "Yanggch",
"PWD": "123456",
"LogIntime": "2018-05-27 11:58:42"
}
2018-05-27 19 : 58 : 45.796 디버그 86072 --- [NIO-3030-Exec-5] c.yanggch.demo.aop.comment.weblogaspect : com.yanggch.demo.aop.web.securityapi.echo : 요청 매개 변수 : "Yanggch"
2018-05-27 19 : 58 : 45.796 디버그 86072 --- [NIO-3030-Exec-5] C.Yanggch.demo.aop.comment.weblogaspect : 응답 매개 변수 : "Hello, Yanggch"
이것으로부터 우리는 나머지 인터페이스 메소드에서 로그를 출력하기위한 코드를 작성하지 않지만 AP를 통해 항목 매개 변수를 출력하고 매개 변수를 각 REST 입력 메소드에 출력하기위한 코드를 자동으로 추가하고 올바르게 실행할 수 있음을 알 수 있습니다.
다른 지침
Pointcut의 조언 유형과 AOP 표현 언어는 앞에서 언급되어 있습니다. 특정 참조는 다음과 같이 참조하십시오.
조언 유형
AOP 표현 언어
1. 메소드 매개 변수 일치
@args ()
2. 메소드 설명 일치
실행 (수정 자-패터 른? ret-type-pattern declaring-type-pattern? name-pattern (param-pattern) 던지기 파울린?)
반환 유형 패턴, 이름 패턴 및 매개 변수 패턴이 필요한 경우.
. ret-type-pattern : 반환 값, 전체 경로 등을 나타내는 클래스 이름 일 수 있습니다.
*. 이름 -Pattern : 메소드 이름을 지정하십시오. *는 모두를 나타냅니다
. 세트는 세트로 시작하는 모든 메소드를 나타냅니다.
. 매개 변수 패턴 : 메소드 매개 변수 (선언 된 유형), (..)는 모든 매개 변수를 나타내고 ()는 하나의 매개 변수를 나타냅니다.
. (, String)은 첫 번째 매개 변수가 값이고 두 번째 매개 변수는 String 유형입니다.
3. 현재 AOP 프록시 객체 유형 일치
4. 대상 클래스 매칭
@목표()
@이내에()
5.이 주석으로 표시된 일치 방법
@주석()
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.