Spring学习三(AOP面向切面编程)

一篇文章搞懂spring aop,什么是AOP,什么是面向切面编程,动态代理实现AOP,Spring boot 实现Aop,spring 实现aop,附代码图文演示(保姆级教程) spring、aop、oop、java 阅读详情

1、AOP面向切面编程

这里写图片描述
AOP(Aspect Oriented Programming)面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

1、这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
2、将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP其实是将琐碎的事务和逻辑代码相分离,以便我们更好的关注逻辑代码
代码逻辑比如是插入一条数据,那么琐碎事务就包括获取连接和关闭连接,事务开始,事务提交。
切面就是指在大堆繁琐事务中的逻辑代码。

AOP原理
AOP采取横向的抽取机制,取代传统由于继承产生的代码重复

AOP是在编译时期运用反射机制,通过代理方式向目标类植入代码
这里写图片描述

2、重要概念

1、Target :目标类,需要被增强程序。
2、JoinPoint:连接点,目标类中可以被增强的方法。例如:addUser、updateUser
3、PointCut:切入点,已经被增强的连接点JointPoint。增强已经生效。例如:addUser
切入点 是 连接点 一个子集。
4、Advice:增强/通知,用于增强的方法。例如:before() /after()
5、Intruduction 引介,特殊通知:类添加方法或字段等。(了解)
6、Weaving 织入:将通知(增强)应用目标类,生产代理过程。
7、Proxy:代理
8、Aspect 切面:将通知Adivce 和 切入点 PointCut 结合在一起。

这里写图片描述

入门Demo
这里写图片描述
1、UserService代码

public interface UserService {
    void addUser();

    void deleteUser();
}

2、UserServiceImpl代码

public class UserServiceImpl implements UserService{

    public void addUser() {
        // TODO Auto-generated method stub
        System.out.println("user add");

    }

    public void deleteUser() {
        // TODO Auto-generated method stub
        System.out.println("user delete");
    }

}

3、MyAspect代码

public class MyAspect implements MethodInterceptor {

    public Object invoke(MethodInvocation arg0) throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("开启事务");
        //执行目标方法
        Object obj=arg0.proceed();
        System.out.println("关闭事务");
        return obj;
    }

}

4、beans.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: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/aop 
                           http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 1 目标类 -->
    <bean id="userServiceId" class="com.example.demo1.UserServiceImpl"></bean>  

    <!-- 2 确定通知 -->
    <bean id="myAspect" class="com.example.demo1.MyAspect"></bean>

    <!-- 3 编写aop,通过配置文件,将通知去增强目标类 
        * 如果要使用切入点表达式,必须导入apsjectj的jar: com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    -->
    <aop:config>
        <!-- 3.1 声明切入点(确定对那些方法进行增强) -->
        <aop:pointcut expression="execution(* com.example.demo1.*.*(..))" id="myPointCut"/>
        <!-- 3.2声明切面:切入点 和 通知 结合
            * advisor :特殊的切面,只有一个切入点 和一个通知
            * aspect:就是切面,可以有多个切入点和多个通知 
        -->
        <aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/>

    </aop:config>



</beans>

5、测试

    @Test
    public void testAop() {
        ///com/example/demo1/beans.xml
        String xmlPath = "com/example/demo1/beans.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        UserService userService = (UserService) applicationContext
                .getBean("userServiceId",UserService.class);
        userService.addUser();
        userService.deleteUser();

    }

3、Aspect J

AspectJ是一个基于Java语言的AOP框架
@Aspect 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面
新版本Spring框架,建议使用AspectJ方式来开发AOP

AspectJ规定6种通知类型:
before:前置通知,目标方法前执行。
afterReturning:后置通知,目标方法后执行。
around:环绕通知,目标方法前后执行。
afterThrowing:抛出通知,目标方法发生异常。
after:最终通知,无论什么情况都会执行。
declare-parents:引介

Aspectj演示demo(注解方式)
1、OrderService类

public interface OrderService {
   void addOrder();
   void updateOrder();
}

2、OrderService实现

@Service
public class OrderServiceImpl implements OrderService {

    public void addOrder() {
        // TODO Auto-generated method stub
        System.out.println("addOrder service");
    }

    public void updateOrder() {
        // TODO Auto-generated method stub
        System.out.println("updateOrder service");

    }

}

3、MyAspect代码

package com.example.aspect;

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

@Component
@Aspect
public class MyAspect {

    @Before("execution(* com.example.aspect.*.*(..))")
    public void myBefore(JoinPoint joinPoint) {
        System.out.println("前置通知----" + joinPoint.getSignature().getName());
    }

    @AfterReturning(value = "execution(* com.example.aspect.*.*(..))", returning = "val")
    public void myAfterReturning(JoinPoint joinPoint, Object val) {
        System.out.println("后置通知" + val);
    }

    // 方法有要求:返回值Object,参数类型 ProceedingJoinPoint,抛出异常 Throwable
    @Around("execution(* com.example.aspect.*.*(..))")
    public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前------");

        // 执行目标类
        Object obj = joinPoint.proceed();

        System.out.println("环绕后------");

        return obj;
    }

    // @AfterThrowing(value="execution(* cn.itcast.d_aspectj.b_annotation.*.*(..))",
    // throwing="e")
    public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {
        System.out.println("抛出异常通知" + e.getMessage());
    }

    @After("myPointCut()")
    public void myAfter() {
        System.out.println("最终");
    }

    // 共享表达式,添加到一个特殊的方法上,私有,没有返回值,方法名称自定义
    // * 使用时,在注解中,当成方法调用。例如:@After("myPointCut()")
    @Pointcut("execution(* com.example.aspect.*.*(..))")
    private void myPointCut() {

    }
}

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

    <!-- 1.注解类可以使用扫描 ,生成<bean>-->
    <context:component-scan base-package="com.example.aspect"></context:component-scan>
    <!-- 2.使AspectJ 自动代理 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

5、测试用例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:com/example/aspect/beans.xml")
public class AspectTest {

    @Autowired
    private OrderService orderService;

    @Test
    public void aspectTest1() {
        orderService.addOrder();
        orderService.updateOrder();
    }
}

运行结果
这里写图片描述

【Spring】 AOP面向切面编程 横切关注点从每个方法中抽取出来的同一类非核心业务。在同一个项目中,我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。有十个附加功能,就有十个横切关注点。AOP核心关注点和横切关注点。业务处理的主要流程是核心关注点,非核心代码是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务、异常等。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。(分离核心业务代码与非核心代码通知(增强)每一个横切关注点。 阅读详情

相关推荐

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2921

spring学习三-AOP之面向切面编程

目录 1 AOP的使用 1.1 没有异常通知 1.2 有异常通知 2 AOP源码简析 2.1 从EnableAspectJAutoProxy注解说起 2.2 导入的AspectJAutoProxyRegistrar类 2.3 AnnotationAwareAspectJAutoProxyCreator类的作用 2.4 创建代理的方法 1 AOP的使用 AOP有如下几种通知 @Before::前置通知,在方法执行之前执行 @After:后置通知,在方法执行之后执行 @AfterRu..

qq_35930102的博客 307

计算机网络(国家电网)

1.局域网中NOS(网络操作系统)提供的通信服务有工作站与工作站之间的对等通信,工作站与服务器之间的通信2.ISP:Internet服务商应用层 APDU(应用层协议数据单元)表示层 PPDU(表示层协议数据单元)会话层 SPDU(会话层协议数据单元)传输层 segment(报文段)网络层 packet (数据包)数据链路层 frame(数据帧)物理层 bit (比特)4.

qq_31715647的博客 3184

Spring学习总结(三)- Spring的核心特性之面向切面编程(AOP)总结

在上一篇文章中介绍了如何使用依赖注入(DI)管理和配置应用对象。DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。 1、写在前面的话 前面有一堆理论,是从书中总结后加上自己的理解写的。如果没有基础的话,理解起来有点抽象。如果想要快速应用AOP的话,可以跳到后面示例部分,有不懂的地方再返回来看理论概念也是可以的。 想要了解Spring是如何实现切面的,就从AOP的...

江湖人称小程的博客 540

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 334

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

Spring框架学习三:面向切面编程AOP

一、AOP介绍 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之...

张育嘉的博客 399

量化交易之因子分析大全

在机器学习项目中,特征工程是非常重要的。在量化研究中也是如此。本文将量化研究中常用到的特征,也就是因子进行详细收纳,并给出推导公式和实现代码。

夏之微风的博客 2282

spring学习笔记——面向切面编程AOP三

前面介绍了aop的xml的简单配置和使用,下面介绍一下aop的注解使用方式的例子,可以对照第二篇的 pom文件是相同的; spring.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

weixin_30727835的博客 146

基于Simulink的加速度计振动分析:单自由度质量-弹簧-阻尼系统

摘要:基于Simulink的加速度计单自由度振动分析 本文研究了加速度计的单自由度(SDOF)质量-弹簧-阻尼系统模型,通过MATLAB/Simulink平台建立了完整的振动分析仿真系统。文章详细阐述了理论建模过程,推导了系统运动微分方程和传递函数,并提供了Simulink模型搭建的具体步骤和MATLAB实现代码。研究通过正弦扫频、随机振动和冲击响应三种典型输入信号,分析了系统的幅频特性、相频特性及时域响应,验证了加速度计的工作机理。仿真结果表明,该方法能有效模拟加速度计在不同激励条件下的动态特性,为传感器

AI的内部世界的博客 163

10、高阶ΣΔ调制器设计与优化

本文深入探讨了高阶ΣΔ调制器的设计与优化技术,重点介绍了NTF零点优化方法,通过分散单位圆上的零点分布提升信噪失真比(SQNR)。文章分析了量化噪声耦合技术如何有效提高噪声整形阶数,并对比了CIFB、CIFF、CRFB和CRFF等不同架构的性能特点。同时,详细阐述了基于稳定性与性能权衡的设计流程,结合Schreier的Delta-Sigma Toolbox实现NTF综合与仿真验证。内容涵盖从理论推导到实际设计步骤,为高阶ΣΔ调制器的稳定性提升与性能优化提供了系统性指导。

tgb345678的博客 134

Spring学习笔记(三)--面向切面编程AoP

Spring以控制反转IoC和切面编程AoP这两样先进的设计理念为基础,统一了应用对象的查找、配置和生命周期的管理,分离了业务与基础服务中不同 关注点,使得开发人员可以基于java对象轻松的实现与EJB同样强大的功能。 AOP经常被定为为一种编程技术,用来在系统中提升业务的分离,系统有很多组件组成,每一个组件负责一部分功能。然而,这些组件也常带有一些核 心功能外的其他附带功能,如日志

JordanInShenzhen的博客 964

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 827

Spring三大核心思想之AOP(面向切面编程)

Spring三大核心思想之AOP(面向切面编程) 学习Spring三大核心思想之AOP之前建议先学习: ????1、Srping之IOC思想及使用 ????2、Spring核心思想AOP的底层设计模式之代理模式 ???? 程序员小王的博客:程序员小王的博客 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ???? 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 ????java自学的学习路线:java自学的学习路线 一、什么是AOP(面向切面编程)? AOP 为 Aspec

程序员小王的博客 3896

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring AOP 面向切面编程

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心功能,用于在应用程序中实现横切关注点(cross-cutting concerns)的模块化。在传统的面向对象编程(OOP)中,横切关注点(如日志记录、性能监控、事务管理、安全控制等)往往散布在整个代码库中,导致代码的复用性和可维护性下降。AOP提供了一种将这些关注点从它们所服务的业务逻辑中分离出来的方式。切面(Aspect)切面是描述横切关注点的模块。它封装了影响多个类的行为。

zhzjn的博客 1887

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring——面向切面编程(AOP)

本文介绍了切向切面编程(AOP)中的各个概念,并用两个案例分别讲解了如何通过注解和XML配置的方式使用AOP。

行者无疆的博客 4339

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Spring6】| 面向切面编程AOP(核心重点)

【Spring6】| 面向切面编程AOP(重要)

m0_61933976的博客 1393

Spring AOP面向切面编程

面向切面编程是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只是修改这个行为即可。AOP通过提供另一种思考程序结构的方式来补充了面向对象编程(OOP)。OOP中模块化的基本单元是类(class),而AOP中模块化的基本单元是切面(aspect)。可以这么理解,OOP是解决了纵向的代码复用问题,AOP是解决了横向的代码复用问题。Spring的关键组件之一是AOP框架。

深入Java世界:探索编程之美与技术深度 1028

[Spring] AOP面向切面编程

AOP执行流程,切点表达式,通知类型,切点数据获取

沫洺的博客 1528

Spring AOP——Spring 中面向切面编程

文章目录一、AOP——另一种编程思想1.1 什么是 AOP1.2 为什么需要 AOP1.3 AOP 实现分类二、AOP 术语三、初步认识 Spring AOP3.1 Spring AOP 的特点3.2 Spring AOP 的简单例子四、通过注解配置 Spring AOP4.1 通过注解声明切点指示器4.2 通过注解声明 5 种通知类型4.3 通过注解声明切点表达式4.4 通过注解处理通知中的参数4.5 通过注解配置织入的方式六、总结 前几天学习 《Spring实战》 这本书,记录一下 Spring 中的

方糖世界 2754

AOP面向切面编程

本文介绍了Spring AOP的基本概念和应用。AOP(面向切面编程)是一种横向切割关注点的编程范式,用于解耦日志、事务等横切关注点。文章对比了Spring AOP和AspectJ框架的特点,Spring AOP基于动态代理实现,AspectJ则更强大但复杂。详细讲解了AOP核心术语(切面、切入点、通知等)和五种通知类型的使用方法,包括前置、后置、环绕等通知。通过一个简单案例演示了AOP的实际应用,展示了如何在不修改原有代码的情况下增强方法功能。

xg_960的博客 1602

Spring之面向切面编程AOP(三)

上两节提到Spring的装配bean还有高级装配,这一节就是Spring的另一个核心内容-AOP AOP的基本概念AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等通用的辅助模块,在系统的很多模块都要添加。日志,事务,权限等就是切面,使用这种面向切面编程时,我们仍然可以在一个地方声明通用功能(切面),然后声明这个功能在何时通过何种方式使用,而无需修改应用这个

heihei 8600

Spring核心思想之—AOP(面向切面编程)

IoC概述(详情)AOP:Aspect Oriented Programming (面向切面编程)什么是切面编程呢?切面编程指的是某一类特定问题 所以AOP也可以理解为面向特定方法编程。什么是面向特定方法编程呢?统一功能处理之拦截器、统一数据返回格式、统一异常处理这类的问题的统一处理, 所以拦截器也是AOP的一种应用, AOP是一种思想, 拦截器就是AOP思想的一种实现,. Spring框架实现了这种思想, 提供了拦截器技术的相关接⼝。同样统一数据返回格式、统一异常处理 都是AOP思想的一种实现。

2401_83177222的博客 1301

Spring 面向切面编程AOP 详细讲解

交叉业务。这些交叉业务几乎是通用的,不管你是做银行账户转账,还是删除用户数据。日志,事务处理,安全,这些都是需要做的。如果在每一个业务处理过程当中,都参杂这些交叉业务第一:交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码并没有得到充分的复用,并且修改这些交叉业务代码的话,需要修改多处。第二:程序员无法专注核心业务代码的编写,在编写核心业务代码的同时还需要处理这些交叉业务。使用 AOP 可以很轻松的解决以上问题。如下图:可以更好的理解 AOP思想。简单的说AOP:就是将与核心业务。

weixin_61635597的博客 1009
上一篇: Spring学习二(Bean配置)
下一篇: Spring学习四(Spring事务管理)
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值