springboot aop個人使用筆記

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("=================================================================");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章