springboot、AspectJ切面编程

丶灬走出姿态 提交于 2019-11-26 20:38:50

一)、在pom.xml文件增加以下配置

<!--不指定版本的原因,如不指定版本,会默认下载springboot对应版本的jar -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二)、编写一个controller类,该类主要用于测试

package com.oysept.springboot.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 
 * @author ouyangjun
 */
@RestController
@RequestMapping(value="/aspectj")
public class AspectJController {

	// http://localhost:8080/aspectj/methodOne
	@RequestMapping(value="/methodOne")
	public String methodOne() {
		return "Hello one!";
	}
	
	// http://localhost:8080/aspectj/methodTwo?param1=aaa
	@RequestMapping(value="/methodTwo")
	public String methodTwo(@RequestParam("param1")String param1) {
		System.out.println("==>methodThree, param1:"+param1);
		return "Hello two!";
	}
	
	// http://localhost:8080/aspectj/methodThree?param1=aaa&param2=bbb
	@RequestMapping(value="/methodThree")
	public List<Object> methodThree(@RequestParam("param1")String param1, 
			@RequestParam("param2")String param2) {
		System.out.println("==>参数打印: methodThree, param1:"+param1+", param2:"+param2);
		
		List<Object> list = new ArrayList<Object>();
		list.add("value1");
		list.add(1);
		list.add("value2");
		list.add(2.0);
		return list;
	}
	
}

三)、编写一个aop环绕通知类

package com.oysept.springboot.aop;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 请求参数打印aop
 * @author ouyangjun
 * 注: @Aspect是spring aop切入点语法
 *    @Component是把该类纳入spring容器中管理
 */
@Aspect
@Component
public class ArgsAop {
	
	/**
	 * 匹配规则
	 * execution: 用于匹配方法执行的连接点;
	 * execution(public * *(..)) ==> 匹配所有目标类的public方法,第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法。
	 * execution(* com.oysept.springboot.controller..*.*(..))                ==> 该包及所有子包下任何类的任何方法。
	 * execution(* com.oysept.springboot.controller.*(..))                   ==> 该包下任何类的任何方法。
	 * execution(* com.oysept.springboot.controller.AspectJController.*(..)) ==> 该包下AspectJController类的任何方法。
	 * execution(* com..*.*Controller.method*(..)) ==> 匹配包名前缀为com的任何包下类名后缀为Controller的方法,方法名必须以method为前缀。
	 * execution(* *To(..)) ==> 匹配目标类所有以To为后缀的方法。
	 * 注: 该方法只是为了声明一个公共的环绕通知,也可以直接在具体方法配置,如: @Around("execution(* com.oysept.springboot.controller..*.*(..))")
	 */
	@Pointcut(
			"execution(* com.oysept.springboot.controller..*.*(..))"
			)
	public void agrsAop() {}
	
	/**
	 * 环绕通知,可以根据execution规则配置多个方法
	 * @param point
	 * @return
	 */
	@Around("agrsAop()")
	public Object doProcess(ProceedingJoinPoint point) throws Throwable {
		System.out.println("==>@Around begin----- ");
		
		Object[] objArgs = point.getArgs();
		for(Object obj : objArgs) {
			System.out.print("args: "+obj + "\t");
		}
		System.out.println();
		
		System.out.println("==>@Around end----- ");
		return point.proceed();
	}
	
	@Before("agrsAop()")
	public void before(JoinPoint point) throws Throwable {
		System.out.println("==>@Before begin----- ");
		
		Object[] objArgs = point.getArgs();
		for(Object obj : objArgs) {
			System.out.print("args: "+obj + "\t");
		}
		System.out.println();
		
		System.out.println("==>@Before end----- ");
	}
	
	@After("agrsAop()")
    public void releaseResource(JoinPoint point) {
        System.out.println("==>@After:目标方法:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
        System.out.println("==>@After:参数:" + Arrays.toString(point.getArgs()));
        System.out.println("==>@After:被织入的目标对象:" + point.getTarget());
    }
	
	@AfterReturning(pointcut="agrsAop()", returning="returnValue")
    public void log(JoinPoint point, Object returnValue) {
        System.out.println("==>@AfterReturning:目标方法:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
        System.out.println("==>@AfterReturning:参数:" + Arrays.toString(point.getArgs()));
        System.out.println("==>@AfterReturning:返回值:" + returnValue);
        System.out.println("==>@AfterReturning:被编译目标对象:" + point.getTarget());
    }
    
}

四)、最后直接启动springboot项目,访问http://localhost:8080/aspectj/methodThree?param1=aaa&param2=bbb

本章完结,待续!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!