spring aop的五大通知类

spring aop的五大通知类spring aop的五大通知类

大家好,又见面了,我是你们的朋友全栈君。

spring aop通知(advice)分成五类:

  • 前置通知[Before advice]@Before:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
  • 后置通知、正常返回通知[After returning advice]@AfterReturning:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行;与环绕通知同时使用时,会受环绕通知的影响
  • 异常通知、异常返回通知[After throwing advice]@AfterThrowing:在连接点抛出异常后执行。
  • 最终通知、返回通知[After (finally) advice]@After:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
  • 环绕通知[Around advice]@Around:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
    在这里插入图片描述
    pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>dome03</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
    </dependencies>
    
</project>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <context:component-scan base-package="com.xbj"/>
    <aop:config proxy-target-class="true">
        <aop:aspect ref="myAdvices">
            <aop:pointcut id="pc" expression="execution(* com.xbj.service.impl.*.*(..))"/>
            <aop:before method="before" pointcut-ref="pc" />
            <aop:after-returning method="afterRunturn" pointcut-ref="pc" />
            <aop:after method="afterfinally" pointcut-ref="pc" />
            <aop:around method="around" pointcut-ref="pc" />
            <!--ex 要和 切面的 参数签名一致-->
            <aop:after-throwing method="afterThorw" pointcut-ref="pc" throwing="ex" />
        </aop:aspect>
    </aop:config>
</beans>

UserController.java

package com.xbj.controller;

import com.xbj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
/* @Controller @Repository @Component @Service 都是将bean放入Ioc容器中,只是为了代码的可读性而去区别开 * @Autowired 是从Ioc容器拿对象 * */
@Controller
public class UserController { 
   

    @Autowired
    private UserService userService;

    public void addUser(){ 
   
        userService.addUser();
    }
}

UserDao.java

package com.xbj.dao;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
 public interface UserDao { 
   
    void addUser();
    void delUser();
}

UserDaoImpl.java

package com.xbj.dao.impl;

import com.xbj.dao.UserDao;
import org.junit.runner.RunWith;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@Repository
public class UserDaoImpl implements UserDao { 
   
    public void addUser() { 
   
        System.out.println("addUser");
    }

    public void delUser() { 
   
        System.out.println("delUser");
    }

    //定义初始化方法
    public void myInit(){ 
   
        System.out.println("init...");

    }
    //定义销毁方法
    public void dest(){ 
   
        System.out.println("dest...");
    }

}

UserService.java

package com.xbj.service;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
public interface UserService { 
   
    void addUser();
    void delUser();
}

UserServiceImpl.java

package com.xbj.service.impl;

import com.xbj.dao.UserDao;
import com.xbj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@Service
public class UserServiceImpl implements UserService { 
   
    @Autowired
    private UserDao userDao;
    public void addUser() { 
   
       userDao.addUser();
    }

    public void delUser() { 
   
        userDao.delUser();
    }
}

MyAdvices.java

package com.xbj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
/* * 注意类的包名 * */

@Component
public class MyAdvices { 
   
        //前置通知
    public void before(JoinPoint joinpoint){ 
   
        System.out.println("前置通知");
    }
        //正常放回通知
    public void afterRunturn(JoinPoint joinpoint){ 
   
        System.out.println("afterRunturn");

    }
        //最终返回通知
    public void afterfinally(JoinPoint joinpoint){ 
   
        System.out.println("afterfinally");
    }
        //环绕通知
    public void around(ProceedingJoinPoint proceedingJoinPoint){ 
   
        System.out.println("around-before");
        try { 
   
            proceedingJoinPoint.proceed();
        } catch (Throwable throwable) { 
   
            throwable.printStackTrace();
        }
        System.out.println("around-after");
    }
        //异常通知
    public void afterThorw(Throwable ex){ 
   
        System.out.println("afterThorw"+ex);

    }
}

test.java


import com.xbj.controller.UserController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


/** * @Author:晓宇码匠 * @Date:2019/6/15 0015 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 
   "classpath:applicationContext.xml"})
public class test { 
   
    @Autowired
    private UserController controller;
    @Test
    public void t1() { 
   
        controller.addUser();
    }
}

控制台输出:

前置通知
around-before
addUser
around-after
afterfinally
afterRunturn
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106637.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月22日 下午5:00
下一篇 2022年4月22日 下午5:00


相关推荐

  • 文心一言与千帆大模型平台的区别:探索百度AI生态的双子星

    文心一言与千帆大模型平台的区别:探索百度AI生态的双子星

    2026年3月12日
    2
  • OpenClaw记忆系统深度解析:三层架构解决AI失忆问题 (修正版)

    OpenClaw记忆系统深度解析:三层架构解决AI失忆问题 (修正版)

    2026年3月15日
    2
  • PLANTINUM_plantuml流程图

    PLANTINUM_plantuml流程图bytotinunsplash1.背景随着工作时间的增长,越发觉得用专业的图形(用例图,时序图,ER图等等)去准确表达想法是很重要的。比如针对某个需求绘制的的用例图,比一段乏味的文字来的更加有意义,也便于别人理解。加之最近在学习源码的时候,发现很多书籍中都会使用类图,时序图等UML语言来描述逻辑关系。于是就在网上找了找绘制UML语言时,业界主流的一些工具都用什么,找了半天,大部分都用了下面…

    2025年7月20日
    2
  • 千问Qwen

    千问Qwen

    2026年3月12日
    7
  • 解决WinHTTP Web Proxy Auto-Discovery Service无法启动问题

    解决WinHTTP Web Proxy Auto-Discovery Service无法启动问题需要启动该服务的起因是需要抓包,所以下载了charles,但无任何抓包信息,也没有错误提示,未查到原因。遂又下载了fiddler,此时启动会提示“FailedtoregisterFiddlersasthesystemproxy”,上网查原因是WinHTTPWebProxyAuto-DiscoveryService该服务没有启动,到服务中查询确实如此。解决方案(此为对我生效的解决方案,关联服务未启动等其他问题导致也是有可能的):win+Rregedit打开注册表,找到\HK

    2022年6月21日
    913
  • Seaborn常见绘图总结

    Seaborn常见绘图总结以前粗略的学习过 Matplotlib 绘图 Pandas 绘图 但是都未深入的去学习过 一遇到问题就翻文档 效率低下 听 他们 说 matplotlib 中的 seaborn 绘图很好看而且实用 所以 这里系统的总结一下 seaborn 常见的图形绘制 其目的也是很简单的啦 方便我自己查看 英文很菜 每次都查单词 差点忘了 这里使用的数据还是 seaborn 的默认数据 很多人再看 seaborn 的时候对数据一

    2026年3月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号