Spring学习5——AOP

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程 本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。 阅读详情

AOP

  • AOP(面向切面编程)是OOP(面向对象编程)的衍生和完善
  • AOP通过对业务逻辑的各个部分进行隔离,降低业务逻辑的耦合性,提高程序复用性和开发效率

案例:骑士执行任务前和执行任务后,游吟诗人唱赞歌

采用配置方式使用AOP

一、使用项目SpringDemo2021

链接:https://pan.baidu.com/s/1lsV9SniUIAZ-KN4IB9RUQA
提取码:j9vc

二、创建lesson05子包

在这里插入图片描述

三、创建杀龙任务类

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210419193810541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RvdWJsZXZpZXc=,size_16,color_FFFFFF,t_70

package net.lj.spring.lesson05;

import org.springframework.stereotype.Component;

/**
 * 杀龙任务类
 */
@Component
public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务");
    }
}

四、创建勇敢骑士类

在这里插入图片描述

package net.lj.spring.lesson05;

/**
 * 功能:勇敢骑士类
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("Mike")
public class BraveKnight {
    @Autowired
    private SlayDragonQuest slayDragonQuest;

    public void embarkOnQuest() {
        slayDragonQuest.embark();
    }
}

五、创建游吟诗人类

在这里插入图片描述

package net.lj.spring.lesson05;

import org.springframework.stereotype.Component;

/**
 * 游吟诗人类
 */
@Component
public class Minstrel {
    public void singBeforeQuest() {
        System.out.println("啦啦啦,骑士出发了!");
    }

    public void singAfterQuest() {
        System.out.println("真棒啊!骑士完成了任务!");
    }
}

六、创建Spring配置文件

在这里插入图片描述

<?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/beans
       http://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">

    <!--组件扫描-->
    <context:component-scan base-package="net.lj.spring.lesson05"/>

    <!--AOP配置-->
    <aop:config>
        <!--定义切面-->
        <aop:aspect ref="minstrel">
            <!--定义切点-->
            <aop:pointcut id="embark" expression="execution(* net.lj.spring.lesson05..*.embarkOnQuest(..))"/>
            <!--声明前置通知-->
            <aop:before method="singBeforeQuest" pointcut-ref="embark"/>
            <!--声明后置通知-->
            <aop:after method="singAfterQuest" pointcut-ref="embark"/>
        </aop:aspect>
    </aop:config>
</beans>

七、在pom文件里添加AOP相关依赖

<!--Spring AOP-->                                         
<dependency>                                              
    <groupId>org.springframework</groupId>                
    <artifactId>spring-aop</artifactId>                   
    <version>${spring.version}</version>                  
</dependency>                                             
<!--AspectJ支持-->                                          
<dependency>                                              
    <groupId>aspectj</groupId>                            
    <artifactId>aspectjrt</artifactId>                    
    <version>1.5.4</version>                              
</dependency>                                             
<dependency>                                              
    <groupId>org.aspectj</groupId>                        
    <artifactId>aspectjweaver</artifactId>                
    <version>1.9.6</version>                              
    <scope>runtime</scope>                                
</dependency>              

八、创建测试类

在这里插入图片描述

package net.lj.spring.lesson05;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试骑士类
 */
public class TestKnight {

    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("aop_xml/spring-config.xml");
    }

    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器中获取勇敢骑士对象
        BraveKnight braveKnight = (BraveKnight) context.getBean("Mike");
        // 勇敢骑士执行任务
        braveKnight.embarkOnQuest();
    }

    @After
    public void destroy() {
        // 关闭应用容器
        context.close();
    }
}

运行测试

在这里插入图片描述

采用注解方式使用AOP

一、创建子包

在这里插入图片描述

二、创建杀龙任务

在这里插入图片描述

package net.lj.spring.lesson0502;

import org.springframework.stereotype.Component;

/**
 * 功能:杀龙任务类
 */
@Component
public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务。");
    }
}

三、创建勇敢骑士类

在这里插入图片描述

package net.lj.spring.lesson0502;

/**
 * 勇敢骑士类
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("Mike")
public class BraveKnight {
    @Autowired
    private SlayDragonQuest slayDragonQuest;

    public void embarkOnQuest() {
        slayDragonQuest.embark();
    }
}

四、创建游吟诗人切面

在这里插入图片描述

package net.lj.spring.lesson0502;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 游吟诗人切面
 */
@Aspect // 声明为切面
@Component // 交给Spring容器管理
public class MinstrelAspect {
    // 注解声明切点
    @Pointcut("execution(* net.lj.spring.lesson05..*.embarkOnQuest(..))")
    public void embark() {
    }

    // 注解声明前置通知
    @Before("embark()")
    public void singBeforeQuest(JoinPoint joinPoint) {
        System.out.println("啦啦啦,骑士出发了!");
    }

    // 注解声明后置通知
    @After("embark()")
    public void singAfterQuest(JoinPoint joinPoint) {
        System.out.println("真棒啊!骑士完成了任务!");
    }
}

五、创建Spring配置类

在这里插入图片描述

package net.lj.spring.lesson0502;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AOP配置类
 */
@Configuration // 标明Spring配置类
@ComponentScan("net.lj.spring.lesson0502") // 组件扫描
@EnableAspectJAutoProxy // 开启Spring对AspectJ的支持
public class AopConfig {
}

六、创建骑士测试类

在这里插入图片描述

package net.lj.spring.lesson0502;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 测试骑士类
 */
public class TestKnight {

    private AnnotationConfigApplicationContext context; // 基于注解配置类的应用容器

    @Before
    public void init() {
        // 基于注解配置类创建应用容器
        context = new AnnotationConfigApplicationContext(AopConfig.class);
    }

    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器里获取勇敢骑士对象
        BraveKnight knight = (BraveKnight) context.getBean("Mike");
        // 勇敢骑士执行任务
        knight.embarkOnQuest();
    }

    @After
    public void destroy() {
        // 关闭应用容器
        context.close();
    }
}

七、运行测试

在这里插入图片描述

注解式拦截

  • 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略。它通过动态拦截Action调用的对象,允许开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
  • 此处案例使用注解式拦截

一、创建注解接口

在这里插入图片描述

package net.lj.spring.lesson0502;

import java.lang.annotation.*;

/**
 * 动作注解接口
 */
@Target(ElementType.METHOD) // 拦截目标 - 方法
@Retention(RetentionPolicy.RUNTIME) // 保留策略 - 运行时
@Documented // 注解文档化
public @interface Action {
    String name();
}

二、修改勇敢骑士类

在这里插入图片描述

三、修改游吟诗人切面

在这里插入图片描述

package net.lj.spring.lesson0502;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 功能:游吟诗人切面
 * 作者:华卫
 * 日期:2021年03月29日
 */
@Aspect // 声明为切面
@Component // 交给Spring容器管理
public class MinstrelAspect {
    // 注解声明切点
    @Pointcut("@annotation(net.lj.spring.lesson0502.Action)")
    public void embark() {
    }

    // 注解声明前置通知
    @Before("embark()")
    public void singBeforeQuest(JoinPoint joinPoint) {
        // 获取方法签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取被拦截的方法
        Method method = signature.getMethod();
        // 获取注解式拦截
        Action action = method.getAnnotation(Action.class);
        // 提示用户被拦截了
        System.out.println("[" + action.name() + "]拦截了[" + method.getName() + "]:拦截前!");
        System.out.println("啦啦啦,骑士出发了!");
    }

    // 注解声明后置通知
    @After("embark()")
    public void singAfterQuest(JoinPoint joinPoint) {
        // 获取方法签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取被拦截的方法
        Method method = signature.getMethod();
        // 获取注解式拦截
        Action action = method.getAnnotation(Action.class);
        // 提示用户被拦截了
        System.out.println("[" + action.name() + "]拦截了[" + method.getName() + "]:拦截后!");
        System.out.println("真棒啊!骑士完成了任务!");
    }
}

四、运行测试

在这里插入图片描述

ximalaya 新xm-sign逆向思路 本文主要介绍目标网站新xm-sign值的逆向思路。仅代表个人理解,如有其他建议可在评论区沟通。声明仅仅记录一下自己的学习方法,不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除。 阅读详情

相关推荐

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3310

Spring AOP切点表达式使用及说明

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

Purpletaro的专栏 410

冒险岛脚本函数大全:cm.sendYesNo和cm.warp的20个实战用法

本文深入解析了冒险岛脚本中cm.sendYesNo和cm.warp两个核心函数的20个实战应用场景。从基础的确认对话框交互、条件判断,到复杂的装备强化系统、动态传送与副本入口逻辑,文章通过大量代码示例展示了如何组合运用这两个函数,实现从简单NPC到复杂任务系统的进阶脚本开发,并分享了状态管理、错误处理与性能优化等最佳实践。

t4y5u6i7o的博客 1060

springAop使用表达式排除一个包下的其中一个子包中的所有方法

需求:使用aop记录日志,排除一个包下的其中一个子包中的所有方法 方法一:合并写如下 @Pointcut("execution(* com.gisquest.platform.modules.*.web.*.*(..)) && !execution(* com.gisquest.platform.modules.monitor..*.*(..))") 说明:monitor包是modules下的一个子包,里面是关于监控的一些信息,现在想将其排除掉 方法二:分开写如下...

喜羊羊love红太狼 2460

USRP X410 MPM版本与主机UHD版本不匹配问题记录与解决

至此大功告成!之前安装软件的坑算是填起来了,再次记录一下,希望能帮到有同样问题的小伙伴~

yanzuwu233的博客 1435

INS/伪距组合导航(2)

伪距惯导组合导航

u014430081的博客 828

Spring框架学习笔记05

一、Spring AOP概述 1、AOP含义 AOP: Aspect-Oriented Programming (面向切面编程) 2、AOP作用 Spring的AOP作用在于解耦。AOP让一组类共享相同的行为(比如事务管理、日志管理、安全管理)。OOP(Object-Oriented Programming)只能通过继承类或实现接口来增加代码的耦合度,而且类继承是单根继承(不允许一子多父),阻碍了将更多的行为添加到一组类上,此时AOP可以弥补OOP的不足。 3、AOP与OOP AOP(Aspect-Orie

M_1725046289的博客 340

【TC3xx芯片】TC3xx芯片UCB详解

TC3xx芯片UCB详解

qq_36056498的博客 1万+

Spring中AOP切入点表达式的写法

文章目录1.切入点表达式的写法1.1 全通配写法:* *..*.*(..)1.2 访问修饰符可以省略1.3 返回值可以使用通配符,表示任意返回值1.4 包名需要使用通配符,表示任意包,但是有几级包就需要写几个*1.5 包名可以使用..表示当前包及其子包1.6 类名和方法名都可以使用*来实现通配1.7 参数列表7.8 实际开发中切入点表达式的写法 1.切入点表达式的写法 通常情况下,我们会...

你今天真好看呀 2482

从 OPEN CURSOR 到 SELECT INTO TABLE:把 ABAP 数据读取的底层机制与性能差异讲透

ABAP数据库访问性能优化关键点 摘要:ABAP程序性能的核心在于数据读取方式的选择。本文分析了三种常见数据库访问方式的技术原理:显式游标(CURSOR)、SELECT-ENDSELECT循环和SELECT INTO TABLE。重点揭示了数据从数据库到应用服务器的传输机制,包括OPEN/REOPEN与FETCH操作、Array Fetch批量传输原理以及SAP游标缓存机制。通过VBAK表的性能测试数据对比,证明了不同场景下最优访问方式的选择依据:大数据量时显式游标性能优势明显,而SELECT INTO T

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

YOLOv13改进:原创自研 | 卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1056

记一次SpringAOP实践过程-包扫描和嵌套注解

这次SpringAOP实践过程,是对两个问题的解决或者说理解学习过程记录:包扫描和嵌套注解。 每一次实践得出结论,得出的对过往理论的印证,都是一次悟道,其收益远大于争论和抱怨。 技术是一件比较客观的事,正确与错误,其实就摆在哪里,意见不统一,写段代码试验一下就好了,一段代码印证不了的时候,就多写几段。

Java之旅 7550

SAP MM ME21N保存前检查增强

想在ME21N保存前做一些数据检查, 可以做一个增强功能,  运行 CMOD 新增,   增强接口 输入 MM06E005  (  EXIT_SAPMM06E_012 ) ,在 NCLUDE ZXM06U43 .  里写代码功能。  例子如下: *&---------------------------------------------------------------------*

heng0757的专栏 1万+

Spring 框架学习——AOP之5种增强方法应用范例

Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知)、After Returning Advice(后置通知)、Interception Around Advice(周围通知)、Throws Advice(异常通知)和 Introduction Advice(引介通知)。下面分别进行介绍。 一、前置通知(前置增强) 前置通知顾名思意,该通知织入...

热心网友 1076

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring5学习笔记—AOP编程

实现MethodBeforeAdvice接口//作用:给原始方法添加额外功能//注意:会在原始方法运行之前运行此方法@Override1. 切入点:额外功能加入的位置2. 目的:由程序员根据自己的需要,决定额外功能加入给那个原始方法register()login()简单的测试:所有方法都做为切入点,都加入额外的功能。1. JDK动态代理 Proxy.newProxyInstance()# 通过目标类实现的接口创建代理类2. Cglib动态代理 Enhancer。

分享思想,留下痕迹。 778

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring AOP学习5种通知

一、Spring的AOP分为以下5种类型通知 ①前置通知(Before):在连接点执行前执行该通知 ②正常返回通知(AfterReturning):在连接点正常执行完后执行该通知,若目标方法执行异常则不会执行该通知 ③异常返回通知(AfterThrowing):在连接点执行抛出异常时执行该通知 ④后置通知(after/finally):在连接点执行完成后(不管成功、失败、异常)都会执行该通知 ⑤环绕通知(Around):围绕在连接点前后 二、执行顺序 1、正常执行 ①环绕通知:@Around

qq_34709784的博客 845

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring5框架深入学习理解AOP

Spring5框架深入学习理解AOP 关于作者 作者介绍 ???? 博客主页:作者主页 ???? 简介:JAVA领域优质创作者????、一名在校大三学生????、在校期间参加各种省赛、国赛,斩获一系列荣誉???? ???? 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿????‍???? 文章目录Spring5框架深入学习理解AOP关于作者11、AOP11.1 简单了解下什么是AOP11.2 AOP在Spring中的作用11.3 Aop代码实现第一种方式

Java厂长 699

Spring5之AOP学习

Spring5之AOP学习 概念 AOP是Aspect Oriented Programming的缩写,意为:面向切面编程。是spring框架的一个重要内容,通过它可以减少代码的耦合度。 通知(增强)类型 总共有5种类型的通知,也有人叫增强,spring是通过动态代理在运行期间增强的,但是advice英文翻译为通知的意思,所以网上出现了2种概念。 具体看下表: 类型 描述 @Before 前置通知 @AfterReturning 返回后通知 @After 后置通知 @Around

LLY的博客 224

Spring5学习笔记:AOP

1,AOP(概念) 面向切面的编程,可以通过预编译方式和运行其动态代理实现在不修改源代码的情况下给程序动态统一添加某种特定功能的一种技术。 降低耦合度,提高代码的灵活性和可扩展性。 2,AOP(底层原理) AOP底层使用动态代理,有以下两种情况 有接口情况,使用JDK动态代理 没有接口情况,使用CGLIB动态代理 (1)有接口的情况,创建接口实现类的JDK代理对象,间接增加功能。 (2)没有接口的情况,创建子类对象的CGLIB代理对象,间接增加功能。 ...

眼泪划过的星空 177

Spring5 学习总结-AOP

AOP概念 1.什么是AOP 1.1 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的 耦合度降低 ,提高程序的可重用性,同时提高了开发的效率。 1.2 通俗地讲:不通过修改源代码方式,在主干功能中添加新功能。 AOP底层原理 1.AOP底层使用动态代理 有俩种情况动态代理 第一种,有接口情况,使用JDK动态代理 ...

m0_52901132的博客 677

Spring5框架学习总结一【IOC、AOP】

目录一、Spring概念入门案例二、IOC容器1. IOC底层原理2. IOC接口(BeanFactor)3. IOC操作Bean管理(基于xml)3.1 普通Bean3.2 工厂Bean3.3 Bean的作用域3.4 Bean的声明周期3.5 Bean的自动装配3.6 引入外部属性文件4. IOC操作Bean管理(基于注解)1. 注解创建对象2. 注解属性注入3. 纯注解开发三、Aop1. Aop概念2. Aop底层原理3. Aop在Spring框架中操作3.1 准备工作3.2 基于AspectJ注解3.

程序员战胜 1029

Spring5学习笔记2——AOP

Spring5学习笔记2——AOP 文章目录Spring5学习笔记2——AOP第二部分:AOP编程第一章、静态代理设计模式1. 为什么需要代理设计模式2. 代理设计模式分析2.1 概念2.2 名词解释2.3 代理开发的核心要素2.4 编码2.5 静态代理存在的问题第二章、Spring的动态代理开发1. Spring动态代理的概念2. 搭建开发环境3. Spring动态代理的开发步骤3.1 创建原始对象(目标对象)3.2 定义额外功能(实现MethodBeforeAdvice接口)3.3 定义切入点3.4

Ning_chuan的博客 1089

【Spring5框架学习】AOP

AOP基本概念 什么是AOP 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 使用登录例子说明AOP AOP底层原理 动态代理的使用 AOP底层使用动态代理,有两种情况的动态代理 第一种 有接口,使用JDK动态代理:创建接口实现类代理对象,增强类的方法 第二种 没有接口情况,使用CGLIB动态代理:创建子类的代理对象,增强类的方法 ...

qq_43417265的博客 259

Spring5入门学习五——AOP

Spring5 框架概述 Spring 是轻量级的、开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分:IOC 和 Aop【 IOC:控制反转,把创建对象过程交给 Spring 进行管理;Aop:面向切面,不修改源代码进行功能增强】 Spring 特点:(1)方便解耦,简化开发;(2)Aop 编程支持;(3)方便程序测试;(4)方便和其他框架进行整合;(5)方便进行事务操作;(6)降低 API 开发难度 Spring5 入门案例 1. 下载Spri

qingliuli的博客 197

Spring5基础学习之IOC、AOP

Spring5基础学习之IOC、AOP1. Spring框架概述2.Spring入门案例1.下载Spring2. 创建普通Java项目3.导入Spring5核心jar包4. 创建普通类,在这个类创建普通方法5.创建Spring配置文件,在配置文件中配置要创建的对象6.测试代码3. IOC容器3.1 IOC概念及底层原理3.1.1 什么是IOC?3.1.2 IOC底层原理3.2 IOC接口(BeanFactory)3.3 IOC操作Bean管理(基于XML)IOC 操作 Bean 管理(基于 xml 方

cjhxydream的博客 908

Spring5 之 AOP学习笔记

AOP Spring有两个核心部分,除了一个是IOC,另外一个就是AOP 基本概念 面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。 使用登录例子说明 AOP: 底层原理 Spring底层主要使用动态代理实现AOP 关于动态代理 这里推荐一篇博客,我感觉讲的还可以:Java动态代理 静态代理是我们手动为具有接口的类一个类

shiyansama的博客 308
上一篇: Spring学习4——使用java配置类管理bean
下一篇: Spring学习06——Spring JdbcTemplate
doubleview
博客等级 码龄7年 12粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值