Spring Boot 應用AOP
阿新 • • 發佈:2018-06-21
通知 匹配 ide CA AS 結束 RR 依賴 表示
# Spring Boot 應用AOP
一、在pom中添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二、目標類
@RestController public class StudentController { @GetMapping(value = "/aoptest") public String aopTest(){ return " AOP test success!"; } }
三、切面類
代碼示例如下:
@Aspect @Configuration public class HttpAspect { //使用org.slf4j.Logger,這是Spring實現日誌的方法 private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); /** * 定義AOP掃描路徑 */ @Pointcut("execution(public * com.example.myproject.controller.StudentController.*())") public void log() { } /** * 記錄HTTP請求開始時的日誌 */ @Before("log()") public void doBefore(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //URL logger.info("url={}", request.getRequestURI()); //method logger.info("method={}", request.getMethod()); //ip logger.info("ip={}", request.getRemoteAddr()); //類方法 logger.info("class={} and method name = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); //參數 logger.info("參數={}", joinPoint.getArgs()); } /** * 記錄HTTP請求結束時的日誌 */ @After("log()") public void doAfter() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); logger.info("url = {} end of execution", request.getRequestURL()); } /** * 獲取返回內容 * * @param object */ @AfterReturning(returning = "object", pointcut = "log()") public void doAfterReturn(Object object) { logger.info("response={}", object.toString()); } }
PS:Spring
通過aop.xml
中<aop:config>
配置目標對象、切入點等之間的聯系。示例配置如下:
<aop:config> <aop:aspect id="log" ref="HttpAspect"> <aop:pointcut id="printLog" expression="execution(* com.example.myproject.controller.StudentController.*())" /> <aop:before method="doBefore" pointcut-ref="printLog" /> <aop:after method="doAfter" pointcut-ref="printLog" /> </aop:aspect> </aop:config>
註解解釋
@Aspect
:描述一個切面類。@Configuration
:描述一個配置類。@Pointcut
:聲明一個切入點,切入點決定了連接點關註的內容,可控制通知什麽時候執行。@Before
:前置通知。在某連接點之前執行的通知,但這個通知不能阻止連接點之前的執行流程(除非它拋出一個異常)。@After
最終通知。當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。@AfterReturning
:後置通知。在某連接點正常完成後執行的通知,通常在一個匹配的方法返回的時候執行。
切入點表達式
格式如下:
execution([可見性] 返回類型 [聲明類型].方法名(參數) [異常])
[]
:表示可選。
通配符:
*
:匹配所有字符...
:一般用於匹配多個包,多個參數.+
:表示類及其子類.
運算符:&&
、||
、!
四、啟動類
@SpringBootApplication
public class MyprojectApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyprojectApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyprojectApplication.class, args);
}
}
PS: spring-boot
默認以啟動類所在包為根路徑,掃描當前包及子包。
Spring Boot 應用AOP