ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

你会使用面向切面编程吗(springboot超详细)?

2021-04-19 18:54:05  阅读:198  来源: 互联网

标签:springboot 方法 切入点 编程 add 切面 atguigu execution com



springboot中如何面向切面编程?


一.什么是面向切面编程

面向切面编程(AOP):利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

简单点理解就是:不通过修改源代码方式,在主干功能里面添加新功能

AOP的底层使用的是动态代理方式;

二.AOP中的几个术语

1. 连接点

连接点指的是哪些方法可以被增强,这些方法称为连接点

2. 切入点

实际被真正增强的方法,称为切入点

3. 通知(增强)

实际增强的逻辑部分(扩展的功能)称为通知或增强
通知有多种类型在这里插入图片描述

4. 切面

把通知应用到切入点的过程

5.切入点表达式

  • 切入点表达式作用:

知道对哪个类里面的方法进行增强

  • 语法结构

execution([权限修饰符] [返回类型] [类全路径] [方法名称][参数列表])

举例

  • 对com.atguigu.dao.BookDao类里面的add进行增强
    execution(* com.atguigu.dao.BookDao.add(…))

  • 对com.atguigu.dao.BookDao类里面的所有的方法进行增强
    execution(* com.atguigu.dao.BookDao.* (…))

  • 对com.atguigu.dao包里面所有类,类里面所有方法进行增强
    execution(* com.atguigu.dao.. (…))

权限修饰符可省略,
返回类型用通配符*代替
(…) 代表可变参数

三.如何使用

1.首先肯定是要引入相关依赖啦!!

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2.然后创建一个增强类

@Aspect@Componentpublic class HttpAspect {}

要加上@Aspect注解和@Component注解

3.之后就是写扩展的方法了

这里介绍几个常见的通知

  • @Before 前置通知

在访问到目标方法(add)方法之前,先执行此方法;
在此方法中可以获取request对象,获取请求的URL,请求方法,ip,类方法,请求参数

private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);//这里定义looger,为了后面使用日志进行记录@Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void doBefore(JoinPoint joinPoint) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();//获取requestHttpServletRequest request = attributes.getRequest();//urllogger.info("url={}", request.getRequestURL());//methodlogger.info("method={}", request.getMethod());//iplogger.info("ip={}", request.getRemoteAddr());//类方法logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());//参数logger.info("args={}", joinPoint.getArgs());}

注意:

如果要获取请求方法和参数,需要传入JoinPoint作为形参

  • @After 后置通知(又称最终通知)
    在访问目标方法结束之后,再执行此方法;
@After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") 
	public void after() { 
	System.out.println("after.........");}

  • @AfterReturning 返回通知(后置通知)

在目标方法返回对象之后,此方法接收返回值;

@AfterReturning(returning = "object", pointcut = "log()")public void doAfterReturning(Object object) {logger.info("response={}", object.toString());}

  • @AfterThrowing 异常通知
    在发生异常后执行
@AfterThrowing(value="execution(*com.atguigu.spring5.aopanno.User.add(..))") 
	public void afterThrowing() { 
	System.out.println("afterThrowing........."); }

  • @PointCut 相同切入点的抽取
    我们可以把相同的切入点抽取出来,减少重复代码的开发
//抽取切入点@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")public void pointdemo() { } //前置通知 @Before(value = "pointdemo()") 
	public void before() {
	System.out.println("before.........");
 }

标签:springboot,方法,切入点,编程,add,切面,atguigu,execution,com
来源: https://blog.51cto.com/u_15166109/2718205

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有