Spring基础笔记 (三)

简介: Spring基础笔记 (三)

注解版AOP怎么玩?#


AOP面向切面编程,指的是在程序运行期间,动态的将某段代码,切入到指定方法的指定位置额运行的编程方式 


导入AOP模块#


<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.7.RELEASE</version>
</dependency>


创建业务逻辑类#


  • 我们要做的就是在动态的在div运行前,运行后,出现异常时,正常结束,异常结束等不同情况下打印日志


public class MathAop {
    public int div(int a,int b){
        return  a-b;
    }
}


定义一个日志切面类#


切面类上的方法会动态的感知到,切入点div的状态,在其指定的状态上,做出不同的反应而无序更改仍和div的代码


五种通知方法,对应五种不同的注解,具体的细节,在下面的代码中有注释


@Component
@Aspect
public class AopLog {


抽取切入表达式#


  1. 注解@Pointcut
  2. 表达式可以使用* 通配
  • execution(pulbic com.changwu.tryspring.aop.MathAop.*(int,int))
  • execution(* com.changwu.tryspring.aop.MathAop.div(..))
  1. 本类使用 : 直接用方法名--> pointCut()
  2. 其他类使用: 使用带包名的全路径--> com.changwu.tryspring.aop.AopLog.pointCut()


@Pointcut("execution(* com.changwu.tryspring.aop.MathAop.div(..))")
    public void pointCut(){}


前置通知#


  1. 注解@Before("切入点表达式")
  2. 调用时机: 在目标方法执行前执行
  3. 可选参数: JoinPoint,里面封装着切入点方法的全部信息,比如方法名,参数等等


@Before("com.changwu.tryspring.aop.AopLog.pointCut()")
    public void before(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();  // 获取参数
        String name = joinPoint.getSignature().getName();  //  获取方法名
        System.out.println("前置通知....参数:"+ Arrays.asList(args)+"  方法名: "+name);
    }


后置通知#


  1. 注解@After("切入点表达式")
  2. 调用时机:无论方法正常结束还是异常结束,都调用


@After("execution(* com.changwu.tryspring.aop.MathAop.div(..))")
    public void after(){
        System.out.println("后置通知执行了!!!");
    }


返回通知#


  1. 注解@AfterReturning(value="切入点表达式",returning="XXX")
  2. 调用时机: 方法正常返回执行
  3. 注意点: 函数的入参,参数名和注解中的XXX要相同,里面封装着,函数的返回值结果


@AfterReturning(value = "com.changwu.tryspring.aop.AopLog.pointCut()",returning = "result")
    public void returning(Object result){
        System.out.println("切入点正常执行...运行结果..{"+result+"}");
    }


异常通知#


  1. 注解@AfterThrowing(value="切入点表达式",throwing="XXX")
  2. 调用时机: 切入点出现异常
  3. 注意点:函数的入参,参数名和注解中的XXX要相同,里面封装着,函数的返回值结果
  4. XXX里面封装着方法的异常信息


@AfterThrowing(value = "com.changwu.tryspring.aop.AopLog.pointCut()",throwing = "expection")
    public void afterThrowing(Exception expection){
        System.out.println("切入点出现异常,异常结果..{"+expection+"}..");
    }


环绕通知#


  1. 注解@Around("切入点表达式")
  2. 调用时机: 切入点执行前后都会执行
  3. 参数:ProceedingJoinPoint里面封装了关于切入点的所有信息
  4. proceedingJoinPoint.proceed();返回值: 为切入点的返回值, 必须返回
  5. 环绕通知里面的所有异常全部抛出去,,一旦我们try起来了,异常通知就获取不到异常,进而返回通知就认为方法是正常结束的,结果为NULL


@Around("com.changwu.tryspring.aop.AopLog.pointCut()")
    public Object arounding(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知开始:  方法名:  "+
                proceedingJoinPoint.getSignature().getName() +
                "将要被执行   参数为:  "+Arrays.asList(proceedingJoinPoint.getArgs()));
        Object result = proceedingJoinPoint.proceed();// 代理调用方法,如过调用方法add抛出异常,就不会执行后面的代码(所以要抛出去!)
        // 调用方法之后执行
        System.out.println("环绕通知,调用方法之后执行,获取的结果是:"+result);
        return result;
    }
}


注意点: 业务逻辑类,切面类都要添加进IOC

注意点: 切面类都要添加注解@Aspects

补充: JointPoint 可以获取的切入点的信息 而且,必须在参数的第一位


好继续准备,回顾xml版本的spring开发方式需要我们添加如下的配置


<aop:aspectj-autoproxy></aop:aspectj-autopeoxy>



基于注解,开启切面--->@EnableAspectjAutoProxy#


@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.changwu.tryspring.aop")
public class MainAopConfig {
}


测试:#


@Test
public void text14(){
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainAopConfig.class);
    // 根据类型获取bean
    MathAop mathAop = applicationContext.getBean(MathAop.class);
    mathAop.div(2,1);
    applicationContext.close();
}


相关文章
|
2月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
34 1
|
2月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
59 0
|
3月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
|
3月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
6月前
|
NoSQL 前端开发 Java
技术笔记:springboot分布式锁组件spring
技术笔记:springboot分布式锁组件spring
63 1
|
6月前
|
Java Linux 程序员
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
|
6月前
|
XML Java 数据安全/隐私保护
技术笔记:Spring中的通知(Advice)和顾问(Advisor)
技术笔记:Spring中的通知(Advice)和顾问(Advisor)
92 0
|
7月前
|
前端开发 Java 数据格式
【Spring系列笔记】定义Bean的方式
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
131 2
|
7月前
|
缓存 监控 Java
【Spring系列笔记】AOP
面向切面编程就是面向特定方法编程。通过将横切关注点(cross-cutting concerns)从主要业务逻辑中分离出来,提供一种更好的代码模块化和可维护性。 横切关注点指的是在应用程序中横跨多个模块或层的功能,例如日志记录、事务管理、安全性、缓存、异常处理等。
101 0
|
7月前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
125 0