Spring-aop面向切面

1、理解必要的专业术语

 先看看上面图,这是我的个人理解。(画的丑,主打真实)

        1)Advice,通知/增强:类方法中提出来的共性功能(大白话就是提出来的重复代码)
        2)Pointcut,切入点/切点:通知返回的方法
        3)连接点:方法
        4)织入:运行时通知插入到方法的过程
        5)aspect,切面:通知功能在什么时候插入到切入点(通知和切入点的结合)
        6)目标对象:被增强的对象
        7)代理:应用切面的过程(AOP框架使用代理模式创建对象,实现在连接处插入增强)

2、代码练习理解

        1)创建两个类

package com.gc;

public class sy {
    public void a1(){
//        System.out.println("Ac is running ... ");    //共性功能
        System.out.println("a1 is running...");
    }

    public void a2(){
//        System.out.println("Ac is running ... ");
        System.out.println("a2 is running ...");
    }
}
package com.gc;

public class AAdvice {
    public void Ac(){
        System.out.println("Ac is running ... ");
    }
}

        2)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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="sy" class="com.gc.sy"/>
    <bean id="aopAdvice" class="com.gc.AAdvice"/>
    <aop:config>
        <!--配置切入点-->
        <aop:pointcut id="pt" expression="execution(* *..*.*(..))"/>
        <!--配置切面-->
        <aop:aspect ref="aopAdvice">
            <aop:before method="Ac" pointcut-ref="pt"/>
        </aop:aspect>
    </aop:config>
</beans>

切点表达式:
 execution(返回类型 包名.方法名(参数类型)),*:就是所有
*..*,比如包名叫com.gc.hh,正常逻辑写是*.*.*,简写就是*..*

        3)测试

package com.bdqn.test;

import com.bdqn.sy;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AAtest {
    @Test
    public void test(){
        ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
        sy sy=(com.bdqn.sy) cxt.getBean("sy");
        sy.a1();
    }
}

 可以看到增强方法成功插入到切入点了。

这时候肯定有同学问,为什么是插入到前面?注意看applicationContext.xml配置中的aop:before,这是前置增强。

3、Aop五种增强处理
        1)前置增强(aop:before):上面代码已经试过了,就是目标方法前织入增强处理
        2)最终增强(aop:after):无论目标是否抛出异常,方法最后都会织入增强处理
        3)后置增强(aop:after-returning):目标方法正常运行后织入增强处理
        4)异常增强(aop:after-throwing):目标方法抛出异常后织入增强处理
        5)环绕增强(aop:around):目标方法前后都可以织入增强处理

这里演示一下环绕增强,解决一下疑惑。其他增强处理自己动手试一试。

在上面的代码基础上修改applicationContext.xml:

  <!--配置切面-->
        <aop:aspect ref="aopAdvice">
            <aop:around method="Ac" pointcut-ref="pt"/>
        </aop:aspect>

运行测试类: 

 显示出来增强方法的内容,那切入点方法的内容去哪了?        加入一行代码

package com.bdqn;

import org.aspectj.lang.ProceedingJoinPoint;

public class AAdvice {
    public void Ac(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around_before");
        //调用原始方法
        joinPoint.proceed();
        System.out.println("Ac is running ... ");
    }
}

 可以看到,在调用原始方法前的内容会插入到切入点方法内容的前面,反之。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/8126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos7修改ip

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

uniapp国际化配置

1、创建资源文件 创建一个locale文件夹&#xff0c;新增index.js,en.json,zh-hans.json 2.配置locale文件夹中的index.js文件 import Vue from vue import VueI18n from vue-i18n// v8.x import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from .…

Redis大key问题

Redis大key问题 什么是big key&#xff1f; bigKey的危害&#xff1a; 大key不仅仅是占用内存而已&#xff0c;如果是仅仅内存的问题 那么扩大内存就好了。禁止大key是主要是因为你操作redis&#xff0c;比如说读/写等操作redis的时候 会有io操作&#xff0c;大key会导致io操作…

【K8S】k8s中secret使用方法

secret可以加密用户名和密码文件&#xff0c;将其打包成一个secret并在API服务器上创建对象 echo -n admin > ./username.txt echo -n xvagaxx > ./password.txt将username.txt和password.txt打包成secret kubectl create secret generic db-user-pass \--from-file./u…

【Mysql系列】——详细剖析数据库中的存储引擎

【Mysql系列】——详细剖析数据库中的存储引擎&#x1f60e;前言&#x1f64c;存储引擎什么是存储引擎&#xff1f;Mysql的体系结构&#xff1a;Mysql的体系结构分为四层&#xff1a;连接层服务层引擎层存储层存储引擎的查看存储引擎的指定存储引擎的特点InnoDB介绍InnoDB特点I…

客户反馈终极指南

客户反馈包括客户在交易后分享的有关产品或服务体验的所有信息、问题和输入。 客户反馈可帮助公司改善他们提供的客户体验&#xff0c;并可以在企业内产生积极的变化和增长。无论是正面的还是负面的&#xff0c;客户反馈都有助于调整您的产品和服务&#xff0c;以满足并超越客户…

基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

基于vivado&#xff08;语言Verilog&#xff09;的FPGA学习&#xff08;5&#xff09;——跨时钟处理 1. 为什么要解决跨时钟处理问题 慢时钟到快时钟一般都不需要处理&#xff0c;关键需要解决从快时钟到慢时钟的问题&#xff0c;因为可能会漏信号或者失真&#xff0c;比如&…

Python零基础自学

很多零基础想做程序员的同学&#xff0c;最开始接触的基本上都是 Python 作为常年霸榜的 “最好上手的编程语言” ——Python&#xff0c;深受互联网大厂的喜爱。 而很多小伙伴反应&#xff0c;在刚开始学Python时遇到不少问题&#xff1a; 比如找不到学习资源&#xff0c;不…

Linux系统centos7关闭防火墙命令

CentOS 7使用的防火墙是firewalld&#xff0c;要关闭防火墙可以使用以下命令&#xff1a; 1. 停止firewalld服务&#xff1a; systemctl stop firewalld 2. 禁止firewalld服务开机启动&#xff1a; systemctl disable firewalld 3. 查看firewalld服务状态&#xff1a; sys…

java 线程池

一.简单的线程池设计&#xff1a; 线程池的执行示意图&#xff1a; 二. 线程池的核心参数&#xff1a; 三.线程池的处理流程&#xff1a; 四.线程池的阻塞队列&#xff1a; 1.基于数组的有界阻塞队列 2.基于链表的有界阻塞队列 3.基于链表的无界阻塞队列 4.同步移交阻塞队列…

2003-2019年各省专利申请和授权量数据/2003-2019年31省专利申请和授权量数据

2003-2019年各省专利申请和授权量数据/2003-2019年31省专利申请量和授权量数据 2003-2019年各省专利申请和授权量数据/2003-2019年31省专利申请和授权量数据 1、时间&#xff1a;2003-2019年 2、来源&#xff1a;国家知识产权专利数据库 3、指标&#xff1a;专利申请数、发…

数据结构和算法(一):复杂度、数组、链表、栈、队列

从广义上来讲&#xff1a;数据结构就是一组数据的存储结构 &#xff0c; 算法就是操作数据的方法 数据结构是为算法服务的&#xff0c;算法是要作用在特定的数据结构上的。 10个最常用的数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10…

办公协作效率想提质增效,可借助开源大数据工具!

在信息爆炸式发展的今天&#xff0c;提升办公协作效率&#xff0c;让各部门的信息有效互通起来&#xff0c;做好数据管理&#xff0c;已经成为众企业提升竞争力的方式方法。那么&#xff0c;如果想要提升办公效率&#xff0c;就需要了解开源大数据工具了。在数字化发展进程中&a…

《扬帆优配》西藏地震!美史上最严排放新规将出台,美股收涨

当地时间周四&#xff0c;美股遍及收高&#xff0c;科技股领涨。因耶稣受难日&#xff0c;美股4月7日&#xff08;周五&#xff09;休市&#xff0c;周四为美股本周最终一个买卖日&#xff0c;从本周状况来看&#xff0c;纳指与标普500指数均录得跌幅&#xff0c;别离跌1.1%和0…

回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测

回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测 目录回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测 粒子…

第十四届蓝桥杯题解

声明&#xff1a;以下都无法确定代码的正确性&#xff0c;是赛时代码&#xff0c;希望大家见谅&#xff01;思路可以参考&#xff0c;等后续可以评测之后再去修改博客内错误&#xff0c;也希望大家能够指正错误&#xff01; 试题A&#xff1a;日期统计 分析&#xff1a;这道题…

45-Dockerfile-ARG/ENV指令

AGR/ENV指令前言ARG作用格式说明生效范围使用示例ENV作用格式说明使用环境变量使用示例ARG 和 ENV 的区别前言 本篇来学习下Dockerfile中的AGR/ENV指令 ARG 作用 定义一个可以在构建镜像时使用的变量 格式 ARG <name>[<default value>]说明 在执行 docker b…

【数据结构】AVL树

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《数据结构与算法》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; AVL树&#x1f332;AVL树&#x1f334;AVL树的插入&#x1f334;AVL树的旋转左单旋右单旋左…

Springboot基础学习之(十三):通过代码实现对数据库的增删该查操作(数据库:mysql)

Springboot这个系列实现的案例&#xff1a;员工后台管理系统 之前讲解的内容是前后端的交互&#xff0c;并没有涉及到数据库。把员工信息放置在一个数组中&#xff0c;实现的方法则是对数组的增删改查操作&#xff0c;但是从今天开始&#xff0c;实现的功能则是在数据库的基础上…

看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 2

Vulnhub靶机My File Server: 2渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入③&#xff1a;SSH私钥登入④&#xff1a;SMB共享…