springboot springAOP 理解切面编程

一.什么是切面编程

切面编程(Aspect Oriented Programming,AOP)

如图,这个验证用户这个子流程就成了一个条线,也可以理解成一个切面,aspect的意思就是方面.实现方式有cglib的动态代理,和jdk静态代理.

 

更多理解:https://www.cnblogs.com/Wolfmanlq/p/6036019.html

二.一个切面类的demo

package springbootDemo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author jiangfeng 2018/7/17 14:57
 * 切面类的demo 参考:https://www.cnblogs.com/liuruowang/p/5711563.html
 *
 * Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,
 * Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。
 */
@Component
@Aspect
public class SpringOperator {

	// 切面公式: 表示server包下所有类所有方法都加
	@Pointcut("execution(* springbootDemo.service..*.*(..))")
	public void pointCut(){}

	// joinPoint (连接点):程序执行过程中明确的点,一般是方法的调用. 获取执行的环境
	@Before("pointCut()")
	public void doBefore(JoinPoint joinPoint){
		System.out.println("AOP Before ..."+joinPoint.toString());
	}

	@After("pointCut()")
	public void doAfter(JoinPoint joinPoint){
		System.out.println("AOP After ..."+joinPoint.toString());
	}

	@AfterReturning(pointcut="pointCut()",returning="returnVal")
	public void afterReturn(JoinPoint joinPoint,Object returnVal){
		System.out.println("AOP AfterReturning Advice:"+joinPoint.toString()+"returnval" + returnVal);
	}


	@AfterThrowing(pointcut="pointCut()",throwing="error")
	public void afterThrowing(JoinPoint joinPoint,Throwable error){
		System.out.println("AOP AfterThrowing ..." +joinPoint.toString()+"error: "+ error);
	}

	@Around("pointCut()")
	public Object  around(ProceedingJoinPoint pjp){
		System.out.println("AOP Aronud before...");
		try {
			Object returnval = pjp.proceed();
			System.out.println("AOP Aronud After...");
			return returnval;
		} catch (Throwable e) {
			e.printStackTrace();
			return null;
		}
	}

}

三. 开发步骤:
   1.新增一个切面类
      springbootDemo.aop.SpringOperator,
      并在类上加上注解:
   @Component // 标识spring组件
   @Aspect   //标识切面类

   2.在类里加入切面公式:
    // 切面公式: 表示server包下所有类所有方法都加
    @Pointcut("execution(* springbootDemo.service..*.*(..))")
    public void pointCut(){}

   3.各种切面方法,加注解:before,after,afterReturning,afterThrowing,around

四.相关知识点:
   (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
   (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
   (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
   (4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
   (5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
   (6) execution 切面公式
    '*'  匹配任意字符,但只能匹配一个元素
    '..' 匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用
    '+'  必须跟在类名后面,如Horseman+,表示类本身和继承或扩展指定类的所有类

   Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,
   Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。
   (7) 执行顺序:
   AOP Aronud before...
   AOP Before ...execution(Tag springbootDemo.service.TagService.getTagById(Long))
   2018-07-17 16:16:10.411  INFO 15180 --- [nio-8088-exec-4] springbootDemo.service.TagService
   AOP Aronud After...
   AOP After ...execution(Tag springbootDemo.service.TagService.getTagById(Long))
   AOP AfterReturning

注意:
around 时,如果原方法有返回值时,必须返回.否则原方法返回值将被吞

参考:https://www.cnblogs.com/liuruowang/p/5711563.html

Spring Boot实现AOP面向切面编程的具体方法如下: 1. 首先,你需要在项目的pom.xml文件中添加spring-boot-starter-aop依赖。可以参考以下代码: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 然后,你需要编写一个用于拦截的bean。这个bean将包含你想要在目标方法执行前后执行的逻辑。你可以使用注解或者编程方式来定义切面。例如,你可以使用@Aspect注解来定义一个切面,然后在切面的方法上使用@Before、@After等注解来定义具体的拦截行为。 3. 接下来,你需要将切面应用到目标对象上,创建代理对象。这个过程称为织入(Weaving)。在Spring Boot中,你可以使用@EnableAspectJAutoProxy注解来启用自动代理,它会根据切面定义自动创建代理对象。 总而言之,Spring Boot实现AOP面向切面编程的具体方法包括:添加依赖、编写用于拦截的bean,以及启用自动代理。这样就能实现在目标方法执行前后执行特定逻辑的效果了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合aop面向切面编程过程解析](https://download.csdn.net/download/weixin_38689551/12743012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot实现AOP面向切面编程](https://blog.csdn.net/weixin_52536274/article/details/130375560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值