spring boot 框架配置 aop
依賴注入
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
execution表達式-解析
符號 | 含義 |
---|---|
execution( * com.ljq.demo_java14.controller..(…)) | 例子:表達式 |
執行() | 表達式的主體 |
第一個 “*” 符號 | 表示返回值的類型任意 |
com.sample.service.impl | AOP所切的服務的包名,即,我們的業務部分 |
包名後面的". ." | 表示當前包及子包 |
第二個"*" | 表示類名,*即所有類 |
. *(. .) | 表示任何方法名,括號表示參數,兩個點表示任何參數類型 |
代碼演示-個人寫的全部控制器攔截打印日誌
package com.ljq.demo_java14.aop;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* @email [email protected]
* @author:劉俊秦
* @date: 2019/5/11 0011
* @time: 上午 9:44
* 打印日誌
*/
@Component
@Aspect
@Slf4j
public class PrintLog {
@Resource
private HttpServletRequest request;
@Pointcut("execution( * com.ljq.demo_java14.controller.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void before(JoinPoint point) {
printLog_common(point, "請求開始");
}
@After("webLog()")
public void after(JoinPoint point) {
printLog_common(point, "請求結束");
}
@AfterReturning(returning = "res", pointcut = "webLog()")
public void doAfterReturning(Object res) {
// 處理完請求,返回內容
log.info("<<<<<<<<<<<<<<<<<<<<<<< { 響應 } >>>>>>>>>>>>>>>>>>>>>>>>>>>");
String zhi = null != res ? JSON.toJSONString(res) : "沒有返回值";
log.info("響應參數 : " + zhi);
log.info("===================================================================");
}
public void printLog_common(JoinPoint point, String title) {
// 記錄下請求內容
log.info("<<<<<<<<<<<<<<<<<<<<<<< {" + title + "} >>>>>>>>>>>>>>>>>>>>>>>>>>>");
log.info("<<< { 目標爲:" + point.getSignature().getDeclaringTypeName() + "} >>>");
log.info("請求地址 : " + request.getRequestURL().toString());
log.info("請求IP : " + request.getRemoteAddr());
log.info("請求類型爲:" + request.getMethod());
log.info("方法爲:" + point.getSignature().getName());
log.info("參數爲:" + Arrays.toString(point.getArgs()));
log.info("===================================================================");
}
}
spring 框架的配置aop(本人已經不使用)------------------------
aop 的依賴
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
============================================
配置spring-config.xm
<!-- 開啓註解式的aop -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
– 簡單切入所有類所有方法
編寫 UserService.java 類(業務類)
package com.bjpowernode.user.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void insert() {
System.out.println("insert");
}
public void update() {
System.out.println("update");
}
public void delete() {
System.out.println("delete");
}
}
編寫 TestSpring.java 類(測試類 JUnit的類)
package com.bjpowernode;
//包
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.bjpowernode.user.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class) //@RunWith 翻譯成中文就是 測試運行器,JUnit所有的測試方法都是由測試運行器負責執行
@ContextConfiguration(locations = { "classpath:spring-config.xml" }) //@ContextConfiguration Spring整合JUnit4測試時,使用註解引入多個配置文件
public class TestSpring {
@Autowired //自動注入
private UserService service;
@Test //標記測試
public void run() {
service.insert();
service.update();
service.delete();
}
}
編寫 UserServiceInterceptor.java 類(aop切入類)
package com.bjpowernode;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.bjpowernode.user.InitParam;
@Component // 把本類聲明spring組件
@Aspect // 在本類上開啓切面技術(把這個類聲明成切面)
public class UserServiceInterceptor {
@After("within(com.bjpowernode.user.service..*)") //表示方法執行後切入
public void run() {
System.out.println("切入成功!!!!");
}
}
運行結果:
insert 切入成功!!!!
update 切入成功!!!!
delete 切入成功!!!!
------ 註解方式 針對某個方法 切入
創建Annotation -> InitParam 註解類
package com.bjpowernode.user;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.METHOD }) //元註解 定義作用域 ElementType.METHOD作用到方法上
@Retention(RetentionPolicy.RUNTIME) //生命週期 RetentionPolicy.RUNTIME運行時有效
//定義一個標記
public @interface InitParam {
}
創建業務類 UserService
package com.bjpowernode.user.service;
import org.springframework.stereotype.Service;
import com.bjpowernode.user.InitParam;
@Service
public class UserService {
public void insert() {
System.out.println("insert");
}
@InitParam
// 在作過標記的方法上切入程序
public void update() {
System.out.println("update");
}
public void delete() {
System.out.println("delete");
}
}
編寫 UserServiceInterceptor.java 類(aop切入類)
package com.bjpowernode;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.bjpowernode.user.InitParam;
@Component // 把本類聲明spring組件
@Aspect // 在本類上開啓切面技術(把這個類聲明成切面)
public class UserServiceInterceptor {
// annotation(initParam) 括號放的是註解類型變量
// @Before("within(com.bjpowernode.user.service..*)")
// @Before("within(com.bjpowernode.user.service..*) && @annotation(initParam)") //表示方法執行之前切入
@After("within(com.bjpowernode.user.service..*) && @annotation(initParam)") //表示方法執行之後切入
public void run(InitParam initParam) {
System.out.println("切入成功!!!!");
}
}
編寫 TestSpring.java 類(測試類 JUnit的類)
package com.bjpowernode;
//包
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.bjpowernode.user.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class) //@RunWith 翻譯成中文就是 測試運行器,JUnit所有的測試方法都是由測試運行器負責執行
@ContextConfiguration(locations = { "classpath:spring-config.xml" }) //@ContextConfiguration Spring整合JUnit4測試時,使用註解引入多個配置文件
public class TestSpring {
@Autowired //自動注入
private UserService service;
@Test //標記測試
public void run() {
service.insert();
service.update();
service.delete();
}
}
aop普通是使用方式
@Component
@Aspect
@Slf4j
public class PrintLog {
//定義切入點
@Pointcut("execution(* com.ljq.assets.controller.*.*(..))")
public void pointcut() {
}
@Before("pointcut()")
public void before(JoinPoint point) {
log.info("=================================================================");
log.info("@Before:目標爲:" + point.getSignature().getDeclaringTypeName());
log.info("@Before:方法爲:" + point.getSignature().getName());
log.info("@Before:參數爲:" + Arrays.toString(point.getArgs()));
log.info("=================================================================");
}
}
aop獲取HttpServletRequest信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
aop輸出日誌
@Before("pointcut()")
public void before(JoinPoint point) {
log.info("=================================================================");
log.info("@Before:目標爲:" + point.getSignature().getDeclaringTypeName());
log.info("@Before:方法爲:" + point.getSignature().getName());
log.info("@Before:參數爲:" + Arrays.toString(point.getArgs()));
log.info("=================================================================");
}