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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea tomcat插件下载_idea导入tomcat

    idea tomcat插件下载_idea导入tomcat因为昨天已经下载了最新本部Tomcat,知识因为和老师的版本有点出入,于是我百度了方法。这里小结一下。idea下载tomcat配置tomcat图文教程有了昨天的基础之后,今天很快就下好了。我这里以WINDOWS764位;下载9.0.13本部为例。首先确保本机装好了JDK,并配置了环境变量。然后百度搜TomcaT官网,或者直接收官网网站:http://tomc…

    2022年10月17日
  • 初步了解印度数学速算法

    初步了解印度数学速算法印度也是IT发达的国家;初步了解,印度的数学自己有一套东西,有的和我们从小学的有很大区别;它的速算法,有的计算看一眼就能给出答案;这东西练一下也许能帮助减低脑力劳动强度;大家有兴趣自己研究;先初步了解一下;下图,一看就给出答案;它的算法是,14加3得17,扩大10倍170,再加上3*4的结果12,最后结果182;对于十位上的数字相同,两位数乘两位数的算法:如:15*16(1)15+6=21(2)21*10=210(3)5*6=30(4)210+30=240…

    2022年5月23日
  • Java线程(九):Condition-线程通信更高效的方式

    Java线程(九):Condition-线程通信更高效的方式接近一周没更新《Java线程》专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。那么引入本篇的主角,Conditi…

    2022年6月22日
  • Ubuntu20.04环境下安装pip过程遇到问题总结「建议收藏」

    Ubuntu20.04环境下安装pip过程遇到问题总结「建议收藏」今天新装了Ubuntu环境,需要开发Python的代码,需要装一些环境,在安装过程中pip的安装总是出现问题,尝试了很多的方法才成功,下面把我遇到的问题做一下总结:Ubuntu环境如下:下载包的路径在文章末尾问题1:无法定位软件问题:解决办法:修改Ubuntu的软件源就能解决无法定位软件包的问题问题2:安装setuptools报错问题解决办法:执行命令:sudo apt-get install python3-distutils结果如下:正在读取软件包列表… 完成正在分析软件包的

    2022年8月11日
  • 币圈新手入门教程 怎么样投资数字货币[通俗易懂]

    币圈新手入门教程 怎么样投资数字货币[通俗易懂]普通人怎么投资数字货币?最近和几位朋友聊到数字货币,发现很多人虽然都想入场交易,但实际上还不是很了解这个东西,这对于新手来说,是非常危险的!笔者尽管现在主要做的是外汇,但是曾经也炒币有一段时间,今天就以自己的经验,给各位币圈新手做个入门普及。数字货币说到数字货币,先要了解区块链,数字货币实际上是区块链的一个产物,数字货币都是由区块链技术产生的,而区块链技术近几年的快速发展,也推动了数字货币…

    2022年8月29日
  • PyCharm professionl2021激活码【在线破解激活】

    PyCharm professionl2021激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日

发表回复

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

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