SpringBoot使用AOP,PointCut表达式详解以及使用

首先,在pom.xml中添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
1.相关注解

@Before 前置通知,在方法执行之前执行
@After 后置通知,在方法执行之后执行
@AfterRuturning 返回通知,在方法返回结果之后执行
@AfterThrowing 异常通知,在方法抛出异常之后执行
@Around 环绕通知,围绕着方法执行

2.@PointCut 表达式详解

PointCut是指哪些方法需要被执行"AOP",PointCut表达式可以有一下几种方式

2.1 execution:

一般用于指定方法的执行
格式:execution( 方法类型(public等,可省略) 方法的返回值类型 包路径(可省略) 方法的名称(参数) 异常类型(可省略) )

  • 方法类型包含Public,Protected等,可省略
  • 方法返回值类型,*可以包含所有的返回值类型
  • 包路径,如“com.demo…*”,表示"com.demo"包以及该包之下子包的所有类型
  • 方法名称,如“add*”,表示所有以add开头的方法,参数:(*)表示任意一个参数,(…)表示所有参数
  • 异常类型,如execution(* *(…) throws Exception)”匹配所有抛出Exception的方法。
2.2 within:

是用来指定类型的,指定类型中的所有方法将被拦截是用来指定类型的,指定类型中的所有方法将被拦截

  • within(com.demo.service.impl.UserServiceImpl) 匹配UserServiceImpl类对应对象的所有方法调用,并且只能是UserServiceImpl对象,不能是它的子对象
  • within(com.demo…*)匹配com.demo包及其子包下面的所有类的所有方法的外部调用。
2.3. this:

SpringAOP是基于代理的,this就代表代理对象,语法是this(type),当生成的代理对象可以转化为type指定的类型时表示匹配。

  • this(com.demo.service.IUserService)匹配生成的代理对象是IUserService类型的所有方法的外部调用
2.4. target:

SpringAOP是基于代理的,target表示被代理的目标对象,当被代理的目标对象可以转换为指定的类型时则表示匹配。

  • target(com.demo.service.IUserService) 匹配所有被代理的目标对象能够转化成IuserService类型的所有方法的外部调用。
2.5 args:

args用来匹配方法参数

  • args() 匹配不带参数的方法
  • args(java.lang.String) 匹配方法参数是String类型的
  • args(…) 带任意参数的方法
  • args(java.lang.String,…) 匹配第一个参数是String类型的,其他参数任意。最后一个参数是String的同理。
2.6 @within 和 @target

带有相应标注的所有类的任意方法,比如@Transactional

@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional)
2.7 @annotation:

带有相应标注的任意方法,比如@Transactional

@annotation(org.springframework.transaction.annotation.Transactional)

@within和@target针对类的注解,@annotation针对方法的注解

2.8 @args:

参数带有相应标注的任意方法,比如@Transactional

@args(org.springframework.transaction.annotation.Transactional)

3.PointCut使用
3.1基本使用
//PointCut表达式
@Pointcut("execution(public * com.example.demo.controller.UserController.*(..))")
//PointCut签名
public void log(){
}

//下面直接调用log(),相当于直接使用上面的表达式,简化代码
@After("log()")
public void doAfter(){
	logger.info("222222222");
}
3.2PointCut中的运算符

PointCut中可以使用&&、||、!运算

	@Pointcut("execution(public * com.example.demo.controller.UserController.*(..))")
	public void cutController(){
	}
	
	@Pointcut("execution(public * com.example.demo.Service.UserService.*(..))")
	public void cutService(){
	}
	
   //使用  && 运算符,则cutAll()的作用等同于  cutController  和 cutService 之和
	@Pointcut("cutController() && cutService()")
	public void cutAll(){
	}

【Java面试题与答案】点我☞:一键直达
在这里插入图片描述

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用SpringBoot AOP的步骤: 1. 首先,在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个切面类,使用@Aspect注解标记该类,并在该类中定义切点和通知。 ```java @Aspect @Component public class MyAspect { @Pointcut("execution(* com.example.demo.service.*.*(..))") public void pointcut() {} @Before("pointcut()") public void before(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @After("pointcut()") public void after(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); } } ``` 3. 在应用程序主类上添加@EnableAspectJAutoProxy注解,启用自动代理。 ```java @SpringBootApplication @EnableAspectJAutoProxy public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 4. 在需要使用AOP的类或方法上添加自定义注解,并在切面类中使用@Around注解来拦截该注解。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation {} @Around("@annotation(com.example.demo.aspect.MyAnnotation)") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("Before method: " + joinPoint.getSignature().getName()); Object result = joinPoint.proceed(); System.out.println("After method: " + joinPoint.getSignature().getName()); return result; } @Service public class MyService { @MyAnnotation public void doSomething() { System.out.println("Doing something..."); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值