SpringBoot的AOP编程

概述

Spring的两大核心思想:
IOC
IOC(Inversion of Control) 控制反转:对象的创建 由原来代码中new的方法 转移到 spring的配置文件中,由spring工 厂进行创建。

spring不仅提供了对 对象的管理,而且对象和对象 间的依赖关系 也提供了 完美的解决方案–即,DI(Dependency Injection)依赖注入

AOP
面向切面编程
AOP的使用场景:在主要功能上 增加 可有可用的额外功能时 使用。
在这里插入图片描述

AOP的一般使用

依赖坐标
   	`<!--aop启动器-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-aop</artifactId>
       </dependency>
       <!--注解式开发-->
       <dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjweaver</artifactId>
       </dependency>
开发切面整合切入点

以一个执行日志记录为示例


package com.baizhi.aspect;

import com.baizhi.entity.LogEntity;
import com.baizhi.service.LogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.UUID;

@Component //将此类交给工厂管理
@Aspect		//定义切面
@Slf4j		//引入日志
public class TestBeforeAdvice {
   
    @Autowired
    HttpServletRequest request; //此对象可由工厂自动管理
  
//定义切入点,因为此注解只可用在方法上,所以随机定义一个无意义的方法
@Pointcut(value = "execution(* com.baizhi.service.*.*(..))")
   public void pt() {
      }

//配置环绕通知
 @Around(value = "pt()")
 		//ProceedingJoinPoint  参数是 JoinPoint 连接点 的子类
    public Object testAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
   
		
        System.out.println("this is around before");

		 try {
   
            proceed = proceedingJoinPoint.proceed();   //调用目标方法,必须proceed,目标方法才可执行
            return proceed; //此对象包含了原目标方法中的方法名、参数信息、方法对象等信息...
        } catch (Throwable throwable) {
   
        	/*这里不直接抛出异常,是因为 业务层事务的关系,相当与这里有2层事务,当执行有误后,日志可以正常记录,而保证业务层事务正常,所有捕获到执行失败,本次日志将记录,同时,不会让外层事务得不到异常*/
            throw throwable;
        } finally {
   
            log.info("执行完毕”);
        }		
	}

自定义注解开发

注意:自定义注解时,需要改变代理类的实现方式为CGLIB.
AOP动态代理有两种实现方式

    1. Proxy JDK的反射包,aop默认采用 动态代理类 实现(目标类实现的&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值