SpringBoot 통합 Spring AOP 예제 소개
이 글은 주로 SpringBoot의 Spring AOP 통합에 대한 자세한 설명을 소개하는 글입니다. 편집자는 꽤 좋다고 생각하여 지금부터 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다
시작하기 전에 먼저 프로젝트에 필요한 jar 패키지를 추가합니다. 새로운 Maven 종속성은 다음과 같습니다:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
다음으로 요점을 살펴보겠습니다. 여기에 관련된 알림 유형은 사전 알림, 사후 최종 알림, 사후 반환 알림, 사후 예외 알림 및 서라운드 알림입니다. SpringBoot에서 이러한 알림을 추가하는 방법을 자세히 살펴보겠습니다.
먼저 Aspect 측면 클래스를 생성합니다:
@Component @Aspect public class WebControllerAop { }
포인트컷 지정:
//匹配com.zkn.learnspringboot.web.controller包及其子包下的所有类的所有方法 @Pointcut("execution(* com.zkn.learnspringboot.web.controller..*.*(..))") public void executeService(){ }
그런 다음 컨트롤러 요청 처리 클래스를 생성합니다:
package com.zkn.learnspringboot.web.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by zkn on 2016/11/19. */ @RestController @RequestMapping("/aop") public class AopTestController { }
사전 알림
사전 알림 구성:
/** * 前置通知,方法调用前被调用 * @param joinPoint */ @Before("executeService()") public void doBeforeAdvice(JoinPoint joinPoint){ System.out.println("我是前置通知!!!"); //获取目标方法的参数信息 Object[] obj = joinPoint.getArgs(); //AOP代理类的信息 joinPoint.getThis(); //代理的目标对象 joinPoint.getTarget(); //用的最多 通知的签名 Signature signature = joinPoint.getSignature(); //代理的是哪一个方法 System.out.println(signature.getName()); //AOP代理类的名字 System.out.println(signature.getDeclaringTypeName()); //AOP代理类的类(class)信息 signature.getDeclaringType(); //获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //如果要获取Session信息的话,可以这样写: //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION); Enumeration<String> enumeration = request.getParameterNames(); Map<String,String> parameterMap = Maps.newHashMap(); while (enumeration.hasMoreElements()){ String parameter = enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str = JSON.toJSONString(parameterMap); if(obj.length > 0) { System.out.println("请求的参数信息为:"+str); } }
Note : 여기서는 JoinPoint와 RequestContextHolder가 사용됩니다. 알림의 서명 정보(대상 메소드 이름, 대상 메소드 매개변수 정보 등)는 JoinPoint를 통해 얻을 수 있습니다. RequestContextHolder를 통해 요청 정보 및 세션 정보를 얻습니다.
다음으로 사전 알림을 테스트하기 위해 Controller 클래스에 요청 처리 메서드를 추가합니다.
@RequestMapping("/testBeforeService.do") public String testBeforeService(String key,String value){ return "key="+key+" value="+value; }
사전 알림 차단 결과는 다음과 같습니다.
사후 알림
구성 후 반환 알림을 설정하는 코드는 다음과 같습니다.
/** * 后置返回通知 * 这里需要注意的是: * 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息 * 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数 * returning 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,对于returning对应的通知方法参数为Object类型将匹配任何目标返回值 * @param joinPoint * @param keys */ @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys") public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ System.out.println("第一个后置返回通知的返回值:"+keys); } @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys",argNames = "keys") public void doAfterReturningAdvice2(String keys){ System.out.println("第二个后置返回通知的返回值:"+keys); }
반환 후 알림을 테스트하기 위해 Controller에 응답 요청 처리 정보를 추가합니다.
@RequestMapping("/testAfterReturning.do") public String testAfterReturning(String key){ return "key=: "+key; } @RequestMapping("/testAfterReturning01.do") public Integer testAfterReturning01(Integer key){ return key; }
요청을 보낼 때: http://localhost:8001/aop/testAfterReturning .do?key=testsss&value =855sss, 처리 결과는 그림과 같습니다:
요청이 전송된 경우: http://localhost:8001/aop/testAfterReturning01.do?key=55553&value=855sss, 처리 결과는 그림과 같습니다.
예외 게시 알림
예외 게시 알림 구성 방법은 다음과 같습니다.
/** * 后置异常通知 * 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法; * throwing 限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行, * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。 * @param joinPoint * @param exception */ @AfterThrowing(value = "executeService()",throwing = "exception") public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目标方法名: System.out.println(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ System.out.println("发生了空指针异常!!!!!"); } }
Controller에서 응답 요청 처리 클래스 구성:
@RequestMapping("/testAfterThrowing.do") public String testAfterThrowing(String key){ throw new NullPointerException(); }
The Post Exception 알림 방식의 처리 결과는 다음과 같습니다.
Post-final 알림
Post-final 알림은 다음과 같이 구성됩니다.
/** * 后置最终通知(目标方法只要执行完了就会执行后置通知方法) * @param joinPoint */ @After("executeService()") public void doAfterAdvice(JoinPoint joinPoint){ System.out.println("后置通知执行了!!!!"); }
Controller 클래스는 해당 요청 처리 클래스를 구성합니다.
@RequestMapping("/testAfter.do") public String testAfter(String key){ throw new NullPointerException(); } @RequestMapping("/testAfter02.do") public String testAfter02(String key){ return key; }
요청을 보낼 때: http://localhost:8001/ aop/testAfter.do?key=55553&value=855sss
요청을 보낼 때: http://localhost:8001/aop/testAfter02.do? key=55553&value=855sss
서라운드 알림
서라운드 알림의 구성 방법은 다음과 같습니다.
/** * 环绕通知: * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 */ @Around("execution(* com.zkn.learnspringboot.web.controller..*.testAround*(..))") public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println("环绕通知的目标方法名:"+proceedingJoinPoint.getSignature().getName()); try { Object obj = proceedingJoinPoint.proceed(); return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; }
Controller의 해당 요청 처리 클래스는 다음과 같습니다.
@RequestMapping("/testAroundService.do") public String testAroundService(String key){ return "环绕通知:"+key; }
요청이 전송될 때: http://localhost:8001/aop/testAroundService.do?key=55553
요청이 http://localhost:8001/aop/testAfter02.do?key=55553&value=855sss로 전송되면, 주변 알림의 컷인 규칙을 준수하지 않으므로 주변 알림이 실행되지 않습니다.
전체 AOP 구성 코드는 다음과 같습니다.
package com.zkn.learnspringboot.aop; import com.alibaba.fastjson.JSON; import com.google.common.collect.Maps; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.Enumeration; import java.util.Map; /** * Created by zkn on 2016/11/18. */ @Component @Aspect public class WebControllerAop { //匹配com.zkn.learnspringboot.web.controller包及其子包下的所有类的所有方法 @Pointcut("execution(* com.zkn.learnspringboot.web.controller..*.*(..))") public void executeService(){ } /** * 前置通知,方法调用前被调用 * @param joinPoint */ @Before("executeService()") public void doBeforeAdvice(JoinPoint joinPoint){ System.out.println("我是前置通知!!!"); //获取目标方法的参数信息 Object[] obj = joinPoint.getArgs(); //AOP代理类的信息 joinPoint.getThis(); //代理的目标对象 joinPoint.getTarget(); //用的最多 通知的签名 Signature signature = joinPoint.getSignature(); //代理的是哪一个方法 System.out.println(signature.getName()); //AOP代理类的名字 System.out.println(signature.getDeclaringTypeName()); //AOP代理类的类(class)信息 signature.getDeclaringType(); //获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //如果要获取Session信息的话,可以这样写: //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION); Enumeration<String> enumeration = request.getParameterNames(); Map<String,String> parameterMap = Maps.newHashMap(); while (enumeration.hasMoreElements()){ String parameter = enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str = JSON.toJSONString(parameterMap); if(obj.length > 0) { System.out.println("请求的参数信息为:"+str); } } /** * 后置返回通知 * 这里需要注意的是: * 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息 * 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数 * returning 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,对于returning对应的通知方法参数为Object类型将匹配任何目标返回值 * @param joinPoint * @param keys */ @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys") public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ System.out.println("第一个后置返回通知的返回值:"+keys); } @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys",argNames = "keys") public void doAfterReturningAdvice2(String keys){ System.out.println("第二个后置返回通知的返回值:"+keys); } /** * 后置异常通知 * 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法; * throwing 限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行, * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。 * @param joinPoint * @param exception */ @AfterThrowing(value = "executeService()",throwing = "exception") public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目标方法名: System.out.println(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ System.out.println("发生了空指针异常!!!!!"); } } /** * 后置最终通知(目标方法只要执行完了就会执行后置通知方法) * @param joinPoint */ @After("executeService()") public void doAfterAdvice(JoinPoint joinPoint){ System.out.println("后置通知执行了!!!!"); } /** * 环绕通知: * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 */ @Around("execution(* com.zkn.learnspringboot.web.controller..*.testAround*(..))") public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println("环绕通知的目标方法名:"+proceedingJoinPoint.getSignature().getName()); try {//obj之前可以写目标方法执行前的逻辑 Object obj = proceedingJoinPoint.proceed();//调用执行目标方法 return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; } }
전체 컨트롤러 클래스 코드는 다음과 같습니다.
package com.zkn.learnspringboot.web.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by zkn on 2016/11/19. */ @RestController @RequestMapping("/aop") public class AopTestController { @RequestMapping("/testBeforeService.do") public String testBeforeService(String key,String value){ return "key="+key+" value="+value; } @RequestMapping("/testAfterReturning.do") public String testAfterReturning(String key){ return "key=: "+key; } @RequestMapping("/testAfterReturning01.do") public Integer testAfterReturning01(Integer key){ return key; } @RequestMapping("/testAfterThrowing.do") public String testAfterThrowing(String key){ throw new NullPointerException(); } @RequestMapping("/testAfter.do") public String testAfter(String key){ throw new NullPointerException(); } @RequestMapping("/testAfter02.do") public String testAfter02(String key){ return key; } @RequestMapping("/testAroundService.do") public String testAroundService(String key){ return "环绕通知:"+key; } }
위 내용은 SpringBoot 통합 Spring AOP 예제 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











사용자들은 인터넷을 사용하면서 와피(wapi)라는 용어를 접했을 수도 있지만, 와피가 무엇인지 모르는 사람들도 있을 것입니다. 다음은 모르는 사람들의 이해를 돕기 위해 자세히 소개한 것입니다. wapi란 무엇입니까? 답변: wapi는 무선 LAN 인증 및 기밀 유지를 위한 인프라입니다. 이는 일반적으로 사무실 건물과 같은 장소 근처에서 보호되는 적외선 및 블루투스와 같은 기능과 같습니다. 기본적으로 소규모 부서가 소유하므로 이 기능의 범위는 불과 몇 킬로미터에 불과합니다. wapi 관련 소개: 1. Wapi는 무선 LAN의 전송 프로토콜입니다. 2. 이 기술은 협대역 통신의 문제를 방지하고 더 나은 통신을 가능하게 합니다. 3. 신호를 전송하는 데는 하나의 코드만 필요합니다.

2023년에는 AI 기술이 화두가 되면서 다양한 산업, 특히 프로그래밍 분야에 큰 영향을 미치고 있다. 사람들은 AI 기술의 중요성을 점점 더 인식하고 있으며 Spring 커뮤니티도 예외는 아닙니다. GenAI(일반 인공 지능) 기술이 지속적으로 발전함에 따라 AI 기능을 갖춘 애플리케이션 생성을 단순화하는 것이 중요하고 시급해졌습니다. 이러한 배경에서 AI 기능 애플리케이션 개발 프로세스를 단순화하고 간단하고 직관적이며 불필요한 복잡성을 피하는 것을 목표로 하는 "SpringAI"가 등장했습니다. 'SpringAI'를 통해 개발자는 AI 기능이 포함된 애플리케이션을 더욱 쉽게 구축할 수 있어 사용 및 운영이 더욱 쉬워진다.

PlayerUnknown's Battlegrounds라고도 알려진 Pubg는 2016년 인기를 얻은 이후 많은 플레이어를 끌어모은 매우 고전적인 슈팅 배틀 로얄 게임입니다. 최근 win11 시스템이 출시된 후 많은 플레이어들이 win11에서 플레이하고 싶어합니다. win11이 pubg를 플레이할 수 있는지 편집기를 따라가 보겠습니다. win11이 pubg를 플레이할 수 있나요? 답변: Win11은 pubg를 플레이할 수 있습니다. 1. win11 초기에는 win11에서 tpm을 활성화해야 했기 때문에 많은 플레이어가 pubg에서 금지되었습니다. 2. 하지만 플레이어 여러분의 피드백을 바탕으로 블루홀에서는 이 문제를 해결하였고, 이제 win11에서도 정상적으로 pubg 플레이가 가능해졌습니다. 3. 술집을 만난다면

업계 리더인 Spring+AI는 강력하고 유연한 API와 고급 기능을 통해 다양한 산업에 선도적인 솔루션을 제공합니다. 이 주제에서는 다양한 분야의 Spring+AI 적용 사례를 살펴보겠습니다. 각 사례에서는 Spring+AI가 어떻게 특정 요구 사항을 충족하고 목표를 달성하며 이러한 LESSONSLEARNED를 더 넓은 범위의 애플리케이션으로 확장하는지 보여줍니다. 이 주제가 여러분이 Spring+AI의 무한한 가능성을 더 깊이 이해하고 활용하는 데 영감을 줄 수 있기를 바랍니다. Spring 프레임워크는 소프트웨어 개발 분야에서 20년 이상의 역사를 가지고 있으며, Spring Boot 1.0 버전이 출시된 지 10년이 되었습니다. 이제 봄이 왔다는 것에 대해 누구도 이의를 제기할 수 없습니다.

Spring 프로그래밍 방식 트랜잭션을 구현하는 방법: 1. TransactionCallback 및 TransactionCallbackWithoutResult를 사용합니다. 3. Transactional 주석을 사용합니다. 4. @Transactional과 함께 TransactionTemplate을 사용합니다.

최신 win11로 업데이트한 후 많은 사용자가 시스템 사운드가 약간 변경되었지만 이를 조정하는 방법을 알지 못합니다. 따라서 오늘 이 사이트에서는 컴퓨터의 최신 win11 사운드 조정 방법을 소개합니다. 작동 방법도 어렵지 않습니다. 선택 사항도 다양합니다. 와서 다운로드하여 사용해 보세요. 최신 컴퓨터 시스템 Windows 11의 사운드 조정 방법 1. 먼저 바탕 화면 오른쪽 하단의 사운드 아이콘을 마우스 오른쪽 버튼으로 클릭하고 "재생 설정"을 선택합니다. 2. 그런 다음 설정을 입력하고 재생 표시줄에서 "스피커"를 클릭합니다. 3. 그런 다음 오른쪽 하단의 "속성"을 클릭하십시오. 4. 속성에서 "향상" 옵션 표시줄을 클릭하세요. 5. 이때 '모든 음향효과 비활성화' 앞의 √가 체크되어 있으면 취소해 주세요. 6. 그 후 아래에서 설정할 음향 효과를 선택하고 클릭하세요.

Spring에서 트랜잭션 격리 수준을 설정하는 방법: 1. @Transactional 주석을 사용합니다. 2. Spring 구성 파일에서 설정합니다. 3. PlatformTransactionManager를 사용합니다. 4. Java 구성 클래스에서 설정합니다. 자세한 소개: 1. @Transactional 주석을 사용하고, 트랜잭션 관리가 필요한 클래스나 메소드에 @Transactional 주석을 추가하고, 속성에서 격리 수준을 설정합니다. 2. Spring 구성 파일에서 등.

PyCharm은 개발 효율성을 크게 향상시킬 수 있는 풍부한 기능과 도구를 갖춘 강력한 Python 통합 개발 환경입니다. 그 중 교체 기능은 개발 과정에서 자주 사용되는 기능 중 하나로, 개발자가 코드를 빠르게 수정하고 코드 품질을 향상시키는 데 도움을 줄 수 있습니다. 이 기사에서는 초보자가 이 기능을 더 잘 익히고 사용할 수 있도록 특정 코드 예제와 함께 PyCharm의 대체 기능을 자세히 소개합니다. 대체 기능 소개 PyCharm의 대체 기능은 개발자가 코드에서 지정된 텍스트를 빠르게 대체하는 데 도움이 될 수 있습니다.
