SpringBoot 学习之面向切面编程

博客介绍了Java中使用Spring AOP的开发步骤,包括Maven导入包、自定义注解、定义切面运行方法和注解使用。还说明了切面相关注解的作用,如@Aspect、@annotation,以及连接点对象JoinPoint的信息获取,同时提及执行顺序和切点表达式运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Maven导入包

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

2.自定义注解

/**
 * @Auther: yoult
 * @Description: TODO
 * @LoginName: ZDGG
 * @Date: 2020-09-18 9:19 星期五
 *
 */
// 声明可以使用该注解的目标类型
@Target({ElementType.METHOD, ElementType.TYPE})
// 声明注解的保留期限
@Retention(RetentionPolicy.RUNTIME)
public @interface AopDemoAspect {
    String param() default "";
}

3.定义切面运行方法

/**
 * @Auther: yoult
 * @Description: TODO 
 * @LoginName: ZDGG
 * @Date: 2020-09-18 9:14 星期五
 */
@Aspect
@Component
public class AopAspect {
	/**
     * 方法执行循环通知,用于对方法运行前和运行后进行处理
     * @param pjp
     * @param aopDemoAspect
     * @return
     * @throws Throwable
     */
    @Around("@annotation(aopDemoAspect)")
    public Object around(ProceedingJoinPoint pjp, AopDemoAspect aopDemoAspect) throws Throwable {
        //获取参数
        Object[] args = pjp.getArgs();
		// 方法运行前可在此处进行处理
		System.out.println("around front");
		// 运行注解所标记的方法
		Object obj =  pjp.proceed();
		System.out.println("around after");
		// 方法运行后可在此处进行处理
        return obj;
    }
     /**
     * 方法执行前通知
     * @param pjp
     * @param aopDemoAspect
     */
    @Before("@annotation(aopDemoAspect)")
    public void before(JoinPoint pjp, AopDemoAspect aopDemoAspect){
        System.out.println("@Before:模拟权限检查...");
        //获取参数
        Object[] args = pjp.getArgs();
        System.out.println("before");
    }

    /**
     * 方法执行后通知
     * @param pjp
     * @param aopDemoAspect
     */
    @After("@annotation(aopDemoAspect)")
    public void after(JoinPoint pjp, AopDemoAspect aopDemoAspect){
        //获取参数
        System.out.println("@After:模拟释放资源...");
        Object[] args = pjp.getArgs();
        System.out.println("after");
    }

	/**
     * 方法正常退出后执行后通知
     * @param pjp
     * @param aopDemoAspect
     */
    @AfterReturning("@annotation(aopDemoAspect)")
    public void afterReturning(JoinPoint pjp, AopDemoAspect aopDemoAspect){
    	System.out.println("@AfterReturning:模拟日志记录功能...");
        //获取参数
        Object[] args = pjp.getArgs();
        System.out.println("afterReturning");
    }
	
	/**
     * 方法异常退出后执行后通知
     * @param pjp
     * @param aopDemoAspect
     */
    @AfterThrowing("@annotation(aopDemoAspect)")
    public void afterThrowing(JoinPoint pjp, AopDemoAspect aopDemoAspect){
        //获取参数
        Object[] args = pjp.getArgs();
        System.out.println("afterThrowing");
    }

}
  1. @Aspect:作用是把当前类标识为一个切面供容器读取
  2. @annotation(annotationType):匹配指定注解为切入点的方法
  3. JoinPoint:方法中的参数JoinPoint为连接点对象,它可以获取当前切入的方法的参数、代理类等信息
  4. 执行顺序为:around front -> before -> (方法运行) -> around after -> afterReturning / afterThrowing -> after
  5. 可使用 &&、||、!、三种运算符来组合切点表达式,表示与或非的关系

4.注解使用

/**
 * @Auther: yoult
 * @Description: TODO
 * @LoginName: ZDGG
 * @Date: 2020-09-26 10:07 星期六
 */
@Component
public class AopDemoService {
  @AopDemoAspect
  public String aopDemo(String name){
  		return "success:" + name;
  }
}

@AopDemoAspect 注解标注静态方法无效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值