spring通知是什么

不及物动词 其他 43

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring通知是Spring框架中的一个重要特性,用于在对象的方法执行前后或抛出异常时执行额外的逻辑。通知是面向切面编程(AOP)的一部分,它允许我们将横切关注点(如日志记录、事务管理、异常处理等)从主体业务逻辑中分离出来。

    Spring中的通知包括前置通知(Before advice)、后置通知(After advice)、返回通知(After-returning advice)、异常通知(After-throwing advice)和环绕通知(Around advice)。

    前置通知在目标方法执行之前执行,可以进行一些预处理操作。后置通知在目标方法执行之后执行,无论目标方法是否发生异常。返回通知在目标方法正常结束后执行,可以获取目标方法的返回值。异常通知在目标方法抛出异常后执行,可以处理异常相关的操作。环绕通知则是在目标方法执行前后都可以执行一些额外的逻辑,还可以控制目标方法的执行。

    为了使用Spring通知,我们需要定义切面,即通知所要应用的类。切面通常使用注解或XML配置进行定义。我们可以通过在目标方法上使用注解,将切面与目标方法关联起来。当目标方法被调用时,切面中相应的通知就会被执行。

    Spring通知提供了一种非侵入式的方法来管理应用的横切关注点,使得代码更加模块化、可维护和可重用。通过使用通知,我们可以将核心业务逻辑与横切关注点分离,使得系统更加灵活和可扩展。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring通知是Spring框架提供的一种机制,用于在特定事件发生时通知应用程序的组件或者对象。通知可以是预定义的事件,如对象创建、销毁或方法调用等,也可以是自定义的事件。

    1. Spring通知的类型:

      • 前置通知(Before Advice):在目标方法执行前调用通知方法。
      • 后置通知(After Advice):在目标方法执行后调用通知方法,无论目标方法是否抛出异常。
      • 返回通知(After-returning Advice):在目标方法成功执行后调用通知方法。
      • 异常通知(After-throwing Advice):在目标方法抛出异常后调用通知方法。
      • 环绕通知(Around Advice):环绕目标方法执行,可以在目标方法前后执行自定义代码。
    2. Spring通知的实现方式:

      • 基于注解的通知:使用@Before@After@AfterReturning@AfterThrowing@Around等注解将通知方法与目标方法关联起来。
      • 基于XML的通知:在配置文件中使用<aop:before><aop:after><aop:after-returning><aop:after-throwing><aop:around>等元素配置通知。
    3. Spring通知的应用场景:

      • 安全性验证:在方法执行前进行用户权限验证。
      • 日志记录:记录方法的执行时间、参数、返回值等相关信息。
      • 缓存管理:在方法执行前检查缓存是否存在,并在方法执行后将结果存入缓存。
      • 事务管理:在方法执行前后开启和提交事务。
      • 异常处理:在目标方法抛出异常后执行相应的处理代码。
    4. Spring通知的优势:

      • 低依赖性:Spring通知与具体的业务逻辑解耦,提高代码的可维护性和可测试性。
      • 代码重用性:可以将通用的方法逻辑抽取出来,实现代码的复用。
      • 灵活性:可以通过配置文件或注解来定义通知的行为,易于扩展和修改。
    5. Spring通知的实现原理:

      • Spring使用动态代理机制实现通知,通过代理对象包装目标对象,实现在目标方法执行前后调用通知方法。
      • Spring支持使用JDK动态代理和CGLIB动态代理两种方式实现代理。
      • JDK动态代理要求目标对象实现接口,只能代理接口中声明的方法,而CGLIB动态代理通过继承目标类生成子类代理,可以代理非接口方法。
      • Spring根据配置的通知类型选择合适的代理方式,并在Bean创建时自动创建代理对象。
    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring通知指的是在Spring框架中使用AOP(面向切面编程)的一种方式,通过在特定的方法执行前、执行后或发生异常时,自动执行其他的逻辑代码。通知可以在目标方法的开始、结束或异常抛出时被自动调用,以实现对目标方法的增强或额外的逻辑处理。

    Spring框架中提供了四种类型的通知:

    1. 前置通知(Before Advice):在目标方法调用之前执行的通知。前置通知可以用于执行一些准备工作或者校验输入参数。

    2. 后置通知(After Returning Advice):在目标方法返回结果后执行的通知。后置通知可以用于对目标方法的返回结果进行处理或清理工作。

    3. 异常通知(After Throwing Advice):在目标方法抛出异常后执行的通知。异常通知可以用于处理或记录目标方法抛出的异常。

    4. 环绕通知(Around Advice):在目标方法调用前后执行的通知。环绕通知可以自定义在目标方法调用前后执行的逻辑,还可以决定是否继续调用目标方法或者直接返回结果。

    下面我们详细介绍每种通知的使用方法和操作流程。

    1. 前置通知(Before Advice)
      前置通知在目标方法调用之前执行,可以在这个通知中进行一些必要的准备工作或者校验输入参数。通常,前置通知的操作不会影响目标方法的执行结果。

    前置通知的编写过程如下:
    1)首先,在Spring配置文件中配置一个切面(Aspect),通过aop:config元素指定要应用通知的目标类。
    2)然后,定义一个切点(Pointcut),通过aop:pointcut元素指定要拦截的目标方法。
    3)在切面中定义一个方法,使用@Before注解,指定要执行的通知逻辑。
    4)将切点和通知方法关联起来,通过aop:advisor元素将切点和通知绑定在一起。

    以下是一个示例配置文件的代码:

    <beans xmlns:aop="http://www.springframework.org/schema/aop">
    
    <!-- 定义一个切面 -->
    <aop:config>
        <!-- 定义一个切点 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/>
        
        <!-- 定义前置通知 -->
        <aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPointcut"/>
    </aop:config>
    
    <!-- 声明一个前置通知的bean -->
    <bean id="myBeforeAdvice" class="com.example.advice.MyBeforeAdvice"/>
    

    其中com.example.service.*.*(..)表示拦截com.example.service包下的所有类的所有方法。MyBeforeAdvice为自定义的前置通知类。

    接下来,在MyBeforeAdvice类中定义前置通知方法,在方法上使用@Before注解表示该方法为前置通知。

    示例代码如下:

    package com.example.advice;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class MyBeforeAdvice {
    
        @Before("execution(* com.example.service.*.*(..))")
        public void beforeAdvice() {
            // 执行前置通知逻辑
            System.out.println("执行前置通知");
        }
    }
    

    通过以上配置,当调用com.example.service包下的任意方法时,都会触发前置通知的执行。

    1. 后置通知(After Returning Advice)
      后置通知在目标方法返回结果后执行,可以对返回结果进行处理或进行一些清理工作。通常情况下,后置通知不能影响目标方法的返回结果。

    后置通知的编写过程与前置通知类似,只是需要使用@AfterReturning注解,指定要执行的后置通知方法。

    以下是一个示例配置文件的代码:

    <beans xmlns:aop="http://www.springframework.org/schema/aop">
    
    <!-- 定义一个切面 -->
    <aop:config>
        <!-- 定义一个切点 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/>
        
        <!-- 定义后置通知 -->
        <aop:advisor advice-ref="myAfterReturningAdvice" pointcut-ref="myPointcut"/>
    </aop:config>
    
    <!-- 声明一个后置通知的bean -->
    <bean id="myAfterReturningAdvice" class="com.example.advice.MyAfterReturningAdvice"/>
    

    其中com.example.service.*.*(..)表示拦截com.example.service包下的所有类的所有方法。MyAfterReturningAdvice为自定义的后置通知类。

    接下来,在MyAfterReturningAdvice类中定义后置通知方法,在方法上使用@AfterReturning注解表示该方法为后置通知。

    示例代码如下:

    package com.example.advice;
    
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class MyAfterReturningAdvice {
    
        @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
        public void afterReturningAdvice(Object result) {
            // 执行后置通知逻辑
            System.out.println("执行后置通知,返回结果为:" + result);
        }
    }
    

    通过以上配置,当调用com.example.service包下的任意方法并返回结果时,都会触发后置通知的执行。

    1. 异常通知(After Throwing Advice)
      异常通知在目标方法抛出异常后执行,可以处理或记录目标方法抛出的异常。异常通知可以用于实现一些异常处理、异常记录等功能。

    异常通知的编写过程与前置通知和后置通知类似,只是需要使用@AfterThrowing注解,指定要执行的异常通知方法。

    以下是一个示例配置文件的代码:

    <beans xmlns:aop="http://www.springframework.org/schema/aop">
    
    <!-- 定义一个切面 -->
    <aop:config>
        <!-- 定义一个切点 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/>
        
        <!-- 定义异常通知 -->
        <aop:advisor advice-ref="myAfterThrowingAdvice" pointcut-ref="myPointcut"/>
    </aop:config>
    
    <!-- 声明一个异常通知的bean -->
    <bean id="myAfterThrowingAdvice" class="com.example.advice.MyAfterThrowingAdvice"/>
    

    其中com.example.service.*.*(..)表示拦截com.example.service包下的所有类的所有方法。MyAfterThrowingAdvice为自定义的异常通知类。

    接下来,在MyAfterThrowingAdvice类中定义异常通知方法,在方法上使用@AfterThrowing注解表示该方法为异常通知。

    示例代码如下:

    package com.example.advice;
    
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class MyAfterThrowingAdvice {
    
        @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
        public void afterThrowingAdvice(Exception ex) {
            // 执行异常通知逻辑
            System.out.println("执行异常通知,捕获到异常:" + ex.getMessage());
        }
    }
    

    通过以上配置,当调用com.example.service包下的任意方法抛出异常时,都会触发异常通知的执行。

    1. 环绕通知(Around Advice)
      环绕通知是最强大的一种通知类型,可以在目标方法调用之前和之后执行自定义的逻辑,并决定是否继续调用目标方法或直接返回结果。环绕通知可以对目标方法进行完全包围,可以在目标方法的前后执行任意操作。

    环绕通知的编写过程与其他三种通知类型略有不同。

    首先,在切面类中定义一个环绕通知方法,并使用@Around注解指定要执行的通知逻辑。

    以下是一个示例配置文件的代码:

    <beans xmlns:aop="http://www.springframework.org/schema/aop">
    
    <!-- 定义一个切面 -->
    <aop:config>
        <!-- 定义一个切点 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/>
        
        <!-- 定义环绕通知 -->
        <aop:advisor advice-ref="myAroundAdvice" pointcut-ref="myPointcut"/>
    </aop:config>
    
    <!-- 声明一个环绕通知的bean -->
    <bean id="myAroundAdvice" class="com.example.advice.MyAroundAdvice"/>
    

    其中com.example.service.*.*(..)表示拦截com.example.service包下的所有类的所有方法。MyAroundAdvice为自定义的环绕通知类。

    接下来,在MyAroundAdvice类中定义环绕通知方法,在方法上使用@Around注解表示该方法为环绕通知。

    示例代码如下:

    package com.example.advice;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class MyAroundAdvice {
    
        @Around("execution(* com.example.service.*.*(..))")
        public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
            // 执行目标方法之前的逻辑
            System.out.println("环绕通知:开始执行目标方法");
    
            // 调用目标方法
            Object result = pjp.proceed();
    
            // 执行目标方法之后的逻辑
            System.out.println("环绕通知:目标方法执行结束,返回结果为:" + result);
    
            return result;
        }
    }
    

    通过以上配置,当调用com.example.service包下的任意方法时,都会触发环绕通知的执行。

    以上就是Spring通知的基本介绍以及四种通知类型的使用方法和操作流程。通过在Spring框架中使用通知,可以实现在目标方法执行前、执行后或发生异常时,自动执行其他的逻辑代码,从而实现对目标方法的增强或额外的处理。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部