spring——AOP面向切面编程—— 一般切面的 AOP 开发

news2025/1/4 20:27:19

一般切面的 AOP 开发

当我们在使用 Spring AOP 开发时,若没有对切面进行具体定义,Spring AOP 会通过 Advisor 为我们定义一个一般切面(不带切点的切面),然后对目标对象(Target)中的所有方法连接点进行拦截,并织入增强代码。

 

工程依赖:

<?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>org.example</groupId>
    <artifactId>ssw</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.6</version>
        </dependency>
    </dependencies>

</project>

userdao接口:

package org.example.dao;

public interface UserDao
{

    public void add();

    public void delete();

    public void modify();

    public void get();

}

实现userdao接口:

package org.example.dao.impl;

import org.example.dao.UserDao;

public class UserDaoImpl implements UserDao
{

    @Override
    public void add() {
        System.out.println("正在执行 UserDao 的 add() 方法……");
    }


    @Override
    public void delete() {
        System.out.println("正在执行 UserDao 的 delete() 方法……");
    }


    @Override
    public void modify() {
        System.out.println("正在执行 UserDao 的 modify() 方法……");
    }


    @Override
    public void get() {
        System.out.println("正在执行 UserDao 的 get() 方法……");
    }

}

设置前置正确方法UserDaoBeforeAdvice:

package org.example.advice;

import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;


/**
 * 增强代码
 * MethodBeforeAdvice 前置增强
 *
 * @author c语言中文网 c.biancheng.net
 */


public class UserDaoBeforeAdvice implements MethodBeforeAdvice
{

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable
    {

        System.out.println("正在执行前置增强操作…………");

    }

}





设置bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->

    <!-- 定义目标(target)对象 -->
    <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>


    <!-- 定义增强 -->
    <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>


    <!--通过配置生成代理 UserDao 的代理对象 -->
    <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 设置目标对象 -->
        <property name="target" ref="userDao"/>
        <!-- 设置实现的接口 ,value 中写接口的全路径 -->
        <property name="proxyInterfaces" value="org.example.dao.UserDao"/>
        <!-- 需要使用value:增强 Bean 的名称 -->
        <property name="interceptorNames" value="beforeAdvice"/>
    </bean>

</beans>












执行方法:
package org.example;

import org.example.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{

    public static void main(String[] args)
    {
        //获取 ApplicationContext 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        //获取代理对象
        UserDao userDao = context.getBean("userDaoProxy", UserDao.class);

        //调用 UserDao 中的各个方法
        userDao.add();
        userDao.delete();
        userDao.get();
        userDao.modify();

    }

}











 =======================================================================================

设置后置增强:

创建UserDaoAfterAdvice类:

package org.example.advice;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class UserDaoAfterAdvice implements AfterReturningAdvice
{

    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable
    {

        System.out.println("正在执行后置增强操作…………");
    }
}

修改bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->

    <!-- 定义目标(target)对象 -->
    <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>


    <!-- 定义增强 -->
    <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>
    <!-- 定义增强 -->
    <bean id="afterAdvice" class="org.example.advice.UserDaoAfterAdvice"></bean>


    <!--通过配置生成代理 UserDao 的代理对象 -->
    <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 设置目标对象 -->
        <property name="target" ref="userDao"/>
        <!-- 设置实现的接口 ,value 中写接口的全路径 -->
        <property name="proxyInterfaces" value="org.example.dao.UserDao"/>
<!--        &lt;!&ndash; 需要使用value:增强 Bean 的名称 &ndash;&gt;-->
<!--        <property name="interceptorNames" value="beforeAdvice"/>-->
        <!-- 需要使用value:增强 Bean 的名称 -->
        <property name="interceptorNames" value="afterAdvice"/>
    </bean>

</beans>

执行代码:

package org.example;

import org.example.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{

    public static void main(String[] args)
    {
        //获取 ApplicationContext 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        //获取代理对象
        UserDao userDao = context.getBean("userDaoProxy", UserDao.class);

        //调用 UserDao 中的各个方法
        userDao.add();
        userDao.delete();
        userDao.get();
        userDao.modify();

    }

}

=======================================================================================

环绕增强:

创建UserDaoAroundAdvice类:

package org.example.advice;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class UserDaoAroundAdvice implements MethodInterceptor
{


    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable
    {

        System.out.println("基于Spring AOP的环绕增强前置处理.....");
        Object res = null;

        try
        {
            res=methodInvocation.proceed();//调用目标方法  返回目标方法的返回结果
        }
        catch (Throwable e)
        {
            e.printStackTrace();
        }
        System.out.println("基于Spring AOP的环绕增强后置处理.....");
        return res;
    }
}

修改bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->

    <!-- 定义目标(target)对象 -->
    <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>
    
    <!-- 定义增强 -->
    <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>

    <!-- 定义增强 -->
    <bean id="afterAdvice" class="org.example.advice.UserDaoAfterAdvice"></bean>

    <!-- 定义增强 -->
    <bean id="aroundAdvice" class="org.example.advice.UserDaoAroundAdvice"></bean>


    <!--通过配置生成代理 UserDao 的代理对象 -->
    <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 设置目标对象 -->
        <property name="target" ref="userDao"/>
        <!-- 设置实现的接口 ,value 中写接口的全路径 -->
        <property name="proxyInterfaces" value="org.example.dao.UserDao"/>

<!--        &lt;!&ndash; 需要使用value:增强 Bean 的名称 &ndash;&gt;-->
<!--        <property name="interceptorNames" value="beforeAdvice"/>-->

<!--        &lt;!&ndash; 需要使用value:增强 Bean 的名称 &ndash;&gt;-->
<!--        <property name="interceptorNames" value="afterAdvice"/>-->

        <!-- 需要使用value:增强 Bean 的名称 -->
        <property name="interceptorNames" value="aroundAdvice"/>
    </bean>

</beans>

 

执行代码:

package org.example;

import org.example.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{

    public static void main(String[] args)
    {
        //获取 ApplicationContext 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        //获取代理对象
        UserDao userDao = context.getBean("userDaoProxy", UserDao.class);

        //调用 UserDao 中的各个方法
        userDao.add();
        userDao.delete();
        userDao.get();
        userDao.modify();

    }

}

 =======================================================================================

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytest----测试脚本上传git代码仓库

【原文链接】Pytest----测试脚本上传git代码仓库 在企业实战中&#xff0c;自动化测试脚本也要放在代码管理平台的&#xff0c;可以选择第三方公共的git代码托管平台&#xff0c;比如github、gitee等&#xff0c;当然也可以在企业内部搭建gitlab作为代码托管平台&#xff0c;他…

蓝桥杯模拟赛习题练习(一)

题目来源&#xff1a;第十四届蓝桥杯模拟赛第一期 注&#xff1a;代码都是自己写的&#xff0c;不是参考答案&#xff01; 1. 二进制位数 问题描述&#xff1a; 十进制整数2在十进制中是1位数&#xff0c;在二进制中对应10 &#xff0c;是2位数。 十进制整数22在十进制中是2位…

Linux系统调用实现简析

1. 前言 限于作者能力水平&#xff0c;本文可能存在的谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本篇基于 Linux 4.14 ARM 32 glibc-2.31 进行分析。 3. 系统调用的实现 3.1 系统调用的发起 3.1.1 起于用户空间 我们随意挑选一个…

python学习之:妙用魔法函数 __dict___来调用对象中的方法,或者 python文件中的方法

文章目录场景原始写法升级写法面向对象的写法总结场景 原始写法 假设现在有一个文件 tool.py我想在外部输入一个 字符串 就调用这个字符串对应的函数如果你不是用 __dict__ 这个好用的函数&#xff0c;那么你大概率会以下面的方式去写 main 函数&#xff0c;给很多 if但是如果…

网络安全观察报告 态势总览

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件 到如今&#xff0c;中国的互联网发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

创建型 - 单例模式(Singleton pattern)

单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;确保一个类有且只有一个实例&#xff0c;并提供一个全局访问点。 文章目录懒汉式-线程不安全饿汉式-线程安全懒汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现实现方式总结使用场景JDK懒汉式-线程不安…

论文(world、WPS)插入参考文献引用详细教程

一、参考资料 如何在WPS中添加论文参考文献 【Word】怎样给论文添加引用参考文献 word添加各种引用 二、相关介绍 1. 参考文献的标注 参考文献的标注分为全部引用、局部引用、间接引用。 1.1 全部引用&#xff08;直接引用&#xff09; 需要双引号&#xff0c;无论冒号…

[附源码]Python计算机毕业设计SSM基于的社区疫情管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)

硬件准备** ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 使用到硬件模块原理图 功能介绍 四线电阻式触摸屏&#xff0c;拿笔和指甲划拉的&#xff0c;不是现在的容性触摸屏。 ADSP-EDU-BF53x 板卡的 …

《Docker》阿里云服务器docker部署nginx并配置https踩坑记录(完整)

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 来个关注吧&#xff0c;点个赞…

# Docker说明、安装(Windows10家庭版)

Docker说明、安装&#xff08;Windows10家庭版&#xff09; Docker是什么&#xff1f;它是干嘛的&#xff1f; 开始&#xff0c;我就知道别人说是用来加工tar包的。tar包&#xff1f;又是干什么用的&#xff1f; tar包&#xff0c;个人粗俗的理解就是一个环境&#xff0c;里面…

CVPR2021 | VQGAN+:Taming Transformers for High-Resolution Image Synthesis

原文标题&#xff1a;Taming Transformers for High-Resolution Image Synthesis 主页&#xff1a;Taming Transformers for High-Resolution Image Synthesis 代码&#xff1a;https://github.com/CompVis/taming-transformers transformer比CNN缺少了归纳偏置和局部性&…

音视频编解码经典问题汇总(1)

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题&#xff0c;比如说&#xff1a;解码播放的时候&#xff0c;播不出来解码播放的时候&#xff0c;画面有条纹编码的时候&#xff0c;修改分辨率大小&#xff0c;没有反应这三个…

【NumPy 数组副本 vs 视图、NumPy 数组形状、重塑、迭代】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

实验五 进程通信-管道通信

1. 函数int pipe(int fd[2])创建一个管道&#xff0c;管道两端可分别用描述字fd[0]以及fd[1]来描述。需要注意的是&#xff0c;管道的两端是固定了任务的。即一端只能用于读&#xff0c;由描述字fd[0]表示&#xff0c;称其为管道读端&#xff1b;另一端则只能用于写&#xff0c…

我失业了?| ChatGPT生信分析初体验

最近ChatGPT火的一塌糊涂&#xff0c;作为在生物医学和计算机科学领域夹缝求生的边缘摇摆人&#xff0c;也来蹭一波热度。ChatGPT是一个预训练的语言模型&#xff0c;由OpenAI训练。它可以用来生成自然语言文本&#xff0c;并且可以进行对话。它基于Transformer架构&#xff0c…

OAuth2.0的四种授权方式

前言 OAuth 简单理解就是一种授权机制&#xff0c;它是在客户端和资源所有者之间的授权层&#xff0c;用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后&#xff0c;客户端携带令牌可以访问资源所有者的资源。 OAuth2.0 是 OAuth 协议的一个版本&#xff0c;有…

【计算机毕业设计】77.旅游资源网站源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xf…

MATLB|分布式能源的选址与定容IEEE30节点实现

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

Jmeter(四):请求默认值元件应用,模拟http请求实战,正则表达式提取器元件讲解

Jmeter(7)&#xff1a;jmeter请求默认值元件应用 HTTP请求默认值 在公司内部进行测试的时候&#xff0c;一般测试环境访问的接口地址&#xff08;服务器名称 或IP&#xff09;、端口、协议一般都是不变的&#xff0c;但http请求取样器每个请求都要求写一遍 这些信息&#xff0…