【Spring】从面向对象再到面向切面

面向切面(AOP)与面向对象(OOP) 火龙果软件工程技术中心  首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能优雅解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.作为一个使用OOP多年的人来说,当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题时,我觉得应该去探个究竟了.对两种技术的比较最能给我们实际应用提供见解.这里我设计了一个例子:一个OOP应用,其中某些方面适合使用AOP.本文展示了一个简单的例子.一开始介绍了问题域,然后分别给出OOP与AOP的解决方 立即下载

这里写目录标题

Object object = new Object();

世间万物的本质都可看作类的对象,面向对象(OOP)的模式让程序易维护、易复用、易扩展,而面向切面(AOP)则是面向对象的补充,让对象的功能更加强大

对比前面的日志框架技术二者非常相似,他的特点就是在不影响业务的前提下将程序的运行情况输出到控制台,总体来看是起一个辅助的作用,所谓的AOP亦是如此——是在不改原有代码的前提下对其进行增强

一.OOP&AOP

OOP将组件视为对象,AOP将对象的切面视为“对象”

OOP&AOP让程序通过极其简单的方式变得更加全面、强大

AOP(Aspect Oriented Programming)面向切面编程、OOP(Object Oriented Programming)面向对象编程

OOP是一种编程思想,AOP也是一种编程思想,编程思想主要的内容就是指导程序员该如何编写程序,两者都是不同的编程范式各有特色

二.AOP核心

通过以下一个计算程序运行时间的功能,引出AOP相关概念

@Repository
public class AImpl implements A {

    public void save() {

        //记录程序当前执行执行(开始时间)
        Long startTime = System.currentTimeMillis();
        //业务执行万次
        for (int i = 0;i<10000;i++) {

            System.out.println("START ...");
        }
        //记录程序当前执行时间(结束时间)
        Long endTime = System.currentTimeMillis();
        //计算时间差
        Long totalTime = endTime-startTime;
        //输出信息
        System.out.println("执行万次程序消耗时间:" + totalTime + "ms");
    }
    public void m1(){
  System.out.println(" m1 ..."); }
    public void m2(){
  System.out.println(" m2 ..."); }
}

(1) save , m1 和 m2 方法,这些方法我们给起了一个名字叫连接点

(2)对于需要增强的方法我们给起了一个名字叫切入点

(3)将功能抽取到一个方法中,换句话说就是存放 共性功能 的方法,我们给起了个名字叫通知

(4)通知是要增强的内容,会有多个,切入点是 需要被增强的方法 ,也会有多个,那哪个切入点需要添加哪个通知,就需要提前将它们之间的关系描述清楚,那么对于通知和切入点之间的关系描述,我们给起了个名字叫切面

(5) 通知是一个方法 ,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫通知类

三.第一个AOP案例

1.环境准备

  • 创建一个Maven项目

  • pom.xml添加Spring依赖 spring-context

  • 添加A和AImpl类

    public interface A {
    
        public void save();
        public void m1();
    }
    @Repository
    public class AImpl implements A {
    
        public void save() {
    
            System.out.println(System.currentTimeMillis());
            System.out.println("book dao save ...");
        }
        public void m1(){
    
            System.out.println("book dao m1 ...");
        }
    }
    
    
  • 创建Spring的配置类

    @Configuration
    @ComponentScan("yu7daily")
    public class Config {
    
    }
    
    
  • 编写Show运行类

    public class Show {
    
        public static void main(String[] args) {
    
            ShowlicationContext ctx = new AnnotationConfigShowlicationContext(Config.class);
            A A = ctx.getBean(A.class);
            A.save();
        }
    }
    
    

2.AOP实现步骤

1.@EnableAspectJAutoProxy开启注解格式AOP功能

2.@Aspect设置当前类为AOP切面类

3.@Pointcut设置切入点方法

4.@Before

**1.添加依赖

pom.xml

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

因为 spring-context 中已经导入了 spring-aop ,所以不需要再单独导入 spring-aop .

导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。

2.定义接口与实现类:环境准备的时候,AImpl已经准备好,不需要做任何修改

3.定义通知类和通知

通知就是将共性功能抽取出来后形成的方法,共性功能指的就是当前系统时间的打印

public class Test {

    public void method(){

        System.out.println(System.currentTimeMillis());
    }
}

类名和方法名没有要求,可以任意。

4.定义切入点

AImpl中有两个方法,分别是save和m1,我们要增强的是m1方法,该如何定义呢?

public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }
    public void method(){

        System.out.println(System.currentTimeMillis());
    }
}

说明:

切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。

execution及后面编写的内容

5.制作切面

切面是用来描述通知和切入点之间的关系,如何进行关系的绑定?

public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Before("po1()")
    public void method(){

        System.out.println(System.currentTimeMillis());
    }
}

绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置

说明:@Before翻译过来是之前,也就是说通知会在切入点方法执行之前执行,除此之前还有其他四种类型

6.将通知类配给容器并标识其为切面类

@Component
@Aspect
public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Before("po1()")
    public void method(){

        System.out.println(System.currentTimeMillis());
    }
}

7.开启注解格式AOP功能

@Configuration
@ComponentScan("yu7daily")
@EnableAspectJAutoProxy
public class Config {

}

8.运行程序

public class Show {

    public static void main(String[] args) {

        ShowlicationContext ctx = new AnnotationConfigShowlicationContext(Config.class);
        A A = ctx.getBean(A.class);
        A.m1();
    }
}

看到在执行m1方法之前打印了系统时间戳,说明对原始方法进行了增强,AOP编程成功!!!

四.切入点表达式

前面的案例中,有涉及到如下内容:

对于AOP中切入点表达式,我们总共会学习三个内容,分别是 语法格式 、 通配符 和 书写技巧 。

1.语法格式

首先我们先要明确两个概念:

切入点:要进行增强的方法

切入点表达式:要进行增强的方法的描述方式

描述方式一:执行yu7daily.dao包下的A接口中的无参数m1方法

execution(void yu7daily.dao.A.m1())

描述方式二:执行yu7daily.dao.impl包下的AImpl类中的无参数m1方法

execution(void yu7daily.dao.impl.AImpl.m1())

因为调用接口方法的时候最终运行的还是其实现类的方法,所以上面两种描述方式都是可以的。

对于切入点表达式的语法为:

  • 切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名)
execution(public User yu7daily.service.UserService.findById(int))

切入点表达式就是要找到需要增强的方法,所以它就是对一个具体方法的描述,但是方法的定义会有很多,所以如果每一个方法对应一个切入点表达式,极其复杂可以通过以下方式进行简化

2.通配符

使用通配符描述切入点,主要的目的就是简化之前的配置

* : 单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

execution(public * yu7daily.*.UserService.find*(*))

匹配yu7daily包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
.. : 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

execution(public User com..UserService.findById(..))

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法
+ :专用于匹配子类类型

execution(* *..*Service+.*(..))

使用切入点表达式来分析下:

execution(void yu7daily.dao.A.m1())
匹配接口,能匹配到
execution(void yu7daily.dao.impl.AImpl.m1())
匹配实现类,能匹配到
execution(* yu7daily.dao.impl.AImpl.m1())
返回值任意,能匹配到
execution(* yu7daily.dao.impl.AImpl.m1(*))
返回值任意,但是m1方法必须要有一个参数,无法匹配,要想匹配需要在m1接口和实现类添加参数
execution(void com.*.*.*.*.m1())
返回值为void,com包下的任意包三层包下的任意类的m1方法,匹配到的是实现类,能匹配
execution(void com.*.*.*.m1())
返回值为void,com包下的任意两层包下的任意类的m1方法,匹配到的是接口,能匹配
execution(void *..m1())
返回值为void,方法名是m1的任意包下的任意类,能匹配
execution(* *..*(..))
匹配项目中任意类的任意方法,能匹配,但是不建议使用这种方式,影响范围广
execution(* *..u*(..))
匹配项目中任意包任意类下只要以u开头的方法,m1方法能满足,能匹配
execution(* *..*e(..))
匹配项目中任意包任意类下只要以e结尾的方法,m1和save方法能满足,能匹配
execution(void com..*())
返回值为void,com包下的任意包任意类任意方法,能匹配,*代表的是方法
execution(* yu7daily.*.*Service.find*(..))
将项目中所有业务层方法的以find开头的方法匹配
execution(* yu7daily.*.*Service.save*(..))
将项目中所有业务层方法的以save开头的方法匹配

五.AOP通知类型

它所代表的含义是将 通知 添加到 切入点 方法执行的前面。

除了这个注解外,还有没有其他的注解,换个问题就是除了可以在前面加,能不能在其他的地方加?

(1)前置通知,追加功能到方法执行前,类似于在代码1或者代码2添加内容

(2)后置通知,追加功能到方法执行后,不管方法执行的过程中有没有抛出异常都会执行,类似于在代码5添加内容

(3)返回后通知,追加功能到方法执行后,只有方法正常执行结束后才进行,类似于在代码3添加内容,如果方法执行抛出异常,返回后通知将不会被添加

(4)抛出异常后通知,追加功能到方法抛出异常后,只有方法执行出异常才进行,类似于在代码4添加内容,只有方法抛出异常后才会被添加

(5)环绕通知,环绕通知功能比较强大,它可以追加功能到方法执行的前后,这也是比较常用的方式,它可以实现其他四种通知类型的功能

环境准备

1.pom.xml添加Spring依赖 spring-context、aspectjweaver

2.添加A和AImpl类

public interface A {

    public void m1();
    public int m2();
}

@Repository
public class AImpl implements A {

    public void m1(){

        System.out.println(" m1 ...");
    }
    public int m2() {

        System.out.println(" m2 is running ...");
        return 1;
    }
}

  • 创建Spring的配置类

    @Configuration
    @ComponentScan("yu7daily")
    @EnableAspectJAutoProxy
    public class Config {
    
    }
    
    
  • 创建通知类

    @Component
    @Aspect
    public class Test {
    
        @Pointcut("execution(void yu7daily.dao.A.m1())")
        private void po1(){
     }
        public void around(){
    
            System.out.println("around before advice ...");
            System.out.println("around after advice ...");
        }
    }
    
    
  • 编写Show运行类

    public class Show {
    
        public static void main(String[] args) {
    
            ShowlicationContext ctx = new AnnotationConfigShowlicationContext(Config.class);
            A A = ctx.getBean(A.class);
            A.m1();
        }
    }
    
    

环绕通知

(1)原始方法有返回值的处理

  • 修改Test,对A中的m2方法添加环绕通知,
@Component
@Aspect
public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Pointcut("execution(int yu7daily.dao.A.m2())")
    private void po2(){
 }

    @Around("po2()")
    public void aroundM2(ProceedingJoinPoint pjp) throws Throwable {

        System.out.println("around before advice ...");
        //表示对原始操作的调用
        pjp.proceed();
        System.out.println("around after advice ...");
    }
}

  • 修改Show类,调用m2方法
@Component
@Aspect
public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Pointcut("execution(int yu7daily.dao.A.m2())")
    private void po2(){
 }

    @Around("po2()")
    public Object aroundM2(ProceedingJoinPoint pjp) throws Throwable {

        System.out.println("around before advice ...");
        //表示对原始操作的调用
        Object ret = pjp.proceed();
        System.out.println("around after advice ...");
        return ret;
    }
}

说明:

返回的是Object而不是int的主要原因是 Object类型更通用随时可以转型

在环绕通知中是可以对原始方法返回值就行修改的

1.返回后通知

@Component
@Aspect
public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Pointcut("execution(int yu7daily.dao.A.m2())")
    private void po2(){
 }

    @AfterReturning("po2()")
    public void afterReturning() {

        System.out.println("afterReturning advice ...");
    }
}

注意 :返回后通知是需要在原始方法 m2 正常执行后才会被执行,如果 m2() 方法执行的过程中出现了异常,那么返回后通知是不会被执行。后置通知则是不管原始方法有没有抛出异常都会被执行

2.异常后通知

@Component
@Aspect
public class Test {

    @Pointcut("execution(void yu7daily.dao.A.m1())")
    private void po1(){
 }

    @Pointcut("execution(int yu7daily.dao.A.m2())")
    private void po2(){
 }

    @AfterReturning("po2()")
    public void afterThrowing() {

        System.out.println("afterThrowing advice ...");
    }
}

环绕通知注意事项

1. 环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知 2. 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行 3. 对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,最好设定为Object类型 4. 原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object 5. 由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须要处理Throwable异常

IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,... 阅读详情

相关推荐

详细了解sklearn中的CountVectorizer

CountVectorizer 是 scikit-learn(一个流行的 Python 机器学习库)中的一个文本特征提取类,其核心功能是将一系列原始文本(如句子、文档)转换为基于词频(word count)的数值矩阵。它基于词袋模型(Bag of Words, BoW)思想,忽略文本的语法结构和词序,仅关注词汇在文本中出现的频率,从而将文本转化为机器可理解的数字形式。文本 1:"I love machine learning"

2302_76568160的博客 1118

面向切面(AOP)和面向对象编程(OOP)

综述:挺常见的两个概念,温习一些 1.面向对象编程 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。O...

我的博客 3882

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd .

weixin_51484067的博客 2639

【编程思想】理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)

但是也有它的缺点,最明显的就是关注点聚焦时,面向对象无法简单的解决这个问题,一个关注点是面向所有而不是单一的类,不受类的边界的约束,因此OOP无法将关注点聚焦来解决,只能分散到各个类中。大多数支持面向对象的语言,同时也支持面向过程,不论是JAVA、PHP,还是JS,它们都还无法完全面向对象,因为面向过程是必然的,面向过程代表着必要的程序流程,调动对象进行组合或对象内部能力的实现,都一定会存在“过程”,它最终还是需要通过拆分步骤来指导最具体的执行细节。else的判断,这段代码,无疑是很恶心的。

DreamSun的博客 3118

团队管理中最棘手的6个问题

研发团队的管理棘手问题,大多集中在。

xiaolyuh的专栏 741

Windows 11下ROS2 Humble与PyCharm无缝集成实战(避坑指南+完整配置流程)

本文详细介绍了在Windows 11系统下如何实现ROS2 Humble与PyCharm的无缝集成,包括环境准备、ROS2 Humble安装、PyCharm配置以及C++与Qt5混合开发的实战技巧。通过避坑指南和完整配置流程,帮助开发者高效搭建稳定的机器人开发环境,特别适合Windows平台的ROS2开发者。

weixin_28710999的博客 366

面向对象与面向切面

面向对象编程(OOP)是一种编程思想,三大特性就是封装继承和多态,封装是将类的属性给私有化,不让外部直接访问,通过setter和getter方法实现外部访问,提高了程序的安全性;程序的扩展性和可重用性表现在继承和多态上,子类可以继承父类的方法来实现操作,多态实现父类调用子类的实现方法。这样增强了程序的可维护性。面向切面编程(AOP)是一种编程范式【思想】,与业务无关,描述的是横切点,提供从另外一个...

qq_39560484的博客 1789

Cy7c68013A速度测试教程

手里有一个cypress的CY7C68013A模块,一直没空玩。今天便测一下,这个模块的USB2.0速率。 1、开发工具下载 在cypress下载如下开发工具包(开发工具包下载地址) 2、驱动安装 一路Next即可 3、下载CyControl.exe 4、驱动安装 模块连接电脑,此时由于没有安装驱动,在设备管理器中显示未知设备...

LV9586的博客 5891

谈谈面向过程、面向对象、面向切面三种编程思维

面向过程、面向对象、面向切面是三种不同的编程思维,它们有各自的特点、优缺点和应用场景。下面简单介绍一下:

人生不怕起点低,就怕没追求 826

手把手教你解决Realsense D455在ROS下IMU数据不输出的问题(附固件降级指南)

本文详细解析了Realsense D455在ROS环境下IMU数据不输出的问题,提供了固件降级和ROS配置的完整解决方案。通过版本兼容性分析和实战操作指南,帮助开发者快速恢复IMU数据流,优化机器人开发体验。

weixin_42531494的博客 371

seurat v5更新及样本整合方法

1 Seurat 对象和 Assay 类发生了变化:支持更多种类的检测和数据类型,包括磁盘上的矩阵。引入了分层结构来存储数据,例如原始计数、标准化数据和 z 得分/方差稳定数据。可以使用 $ 访问器或 LayerData 函数来访问数据。现有的 Seurat v4 函数和工作流程仍可在 v5 中使用。2 整合工作流程发生了变化:简化了整合流程,提高了速度和内存效率。整合结果与 v4 工作流程略有不同,但用户仍可在 v5 中运行 v4 整合工作流程。

hx2024的博客 2683

【Spring AOP】面向切面编程,面向切面编程是面向对象编程的孪生兄弟嘛?且听我细细道来! ! !

【Spring AOP】面向切面编程,面向切面编程是面向对象编程的孪生兄弟嘛?且听我细细道来! ! !

程序员良辰 587

038、OIS 光学防抖原理与调试:陀螺仪数据融合、Lens Shift OIS 的闭环控制

本文分享了OIS光学防抖系统的调试经验和关键技术要点。作者通过一个"呼吸感"Bug案例,揭示了陀螺仪数据融合和闭环控制的重要性。系统介绍了OIS的三个关键层次:传感器层(陀螺仪特性)、控制层(复合算法)和执行层(闭环控制)。重点讲解了陀螺仪数据融合的互补滤波实现、Lens Shift闭环控制的PID优化策略(包括积分抗饱和和微分滤波),以及前馈补偿的应用。最后总结了调试中的关键问题:数据同步、霍尔校准、温度补偿和性能评估方法,并给出实用建议:平衡算法复杂度与性能、预留带宽余量、重视产线校准等。文章强调OIS

sundong_81的博客 257

面向切面编程的学习(入门)

什么是面向切面? 面向切面是面向对象的补充,怎么理解呢?在程序的功能中可以分为两类:核心功能(登陆、注册、增删改等)、辅助功能(日志、性能统计、事务管理)。 这里所说的辅助功能就是在面向对象编程思想中就被定义为切面,你可以理解为一个横切面,几乎每个核心功能都会涉及到。 ...

Alen艾伦的博客 366

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

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringFramework核心技术五:面向切面编程(AOP)和Spring

面向对象和面向切面两种编程方式的比较 面向方面编程(AOP)通过提供关于程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中,模块化的单元是方面。方面可以实现关注的模块化,例如跨越多种类型和对象的事务管理。(这种担忧在AOP文献中常常被称为横切关注点。) AOP的介绍 1.基本的介绍 AOP框架是Spring的关键组件之一。虽然Sprin...

向小凯同学学习 384

visio安装包

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

面向切面编程(AOP)

介绍了面向切面编程,写了一个例子便于理解

徐子云的博客 273

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spring 面向切面编程AOP的原理

什么是AOP? 面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面  面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 AOP从程序运行角度考虑程序的结构,提取业务

baoendemao的专栏 3303

Spring面向切面编程(AOP)代码示例

(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。类中的方法时,切面将会拦截方法的执行,并根据通知方法中定义的逻辑进行相应的操作。连接点(Join Point):连接点是在应用程序执行过程中能够被切面拦截的特定点,例如方法调用、方法执行、异常抛出等。

学亮编程手记 1206

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

3.1 AOP:(Aspect Oriented Programming)面向切面编程 AOP:(Aspect Oriented Programming)面向切面编程; OOP:(Object Oriented Programming )面向对象编程; 面向切面编程:基于OOP基础之上新的编程思想; 指在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方式,面向切面编程; ...

我是太阳 1万+

面向切面编程与面向对象编程_面向对象编程是否与企业环境兼容?

面向切面编程与面向对象编程 本周,在与我在一所高等学校开设的Java课程有关的研讨会上,我注意到学生编写的代码主要-完全是程序性的。 实际上,尽管Java语言自itself为一种面向对象的语言,但找到由企业中的专业开发人员开发的此类代码并不少见。 例如, JavaBean规范与OOP的主要原理之一封装直接矛盾。 另一个例子是在Java EE和Spring应用程序中同样广泛使用的控制器,服务...

dlz00001的博客 171

Java中的面向切面编程(AOP)

一、什么是AOP? Aspect Oriented Programming ,即面向切面编程。 AOP是对面向对象编程的一个补充。 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中解决。 它的实际含义是在运行时将代码切入到类的指定方法、指定位置上,将不同方法的同一个位置抽象为一个切面对象,并对该对象进行编程。 下面是AOP的一个示意图 二、AOP的优点和一些概念 1、AOP的优点 降低模块之间的耦合度 使系统更容易扩展 更好的代码复用 非业务代码更加集中,不分散,便于统一管理

pedro7k的博客 2万+

spring核心之横向切面编程aop

一、spring核心之 aop(重点) aop: Aspect Oriented Programming 面向切面编程 ,是一种思想。 oop: Object Orinted programming 面向对象编程 ,是一个思想。 总结: oop:纵向抽取 好处:1)提高可重用性 2)提高可扩展和可维护 3)多态 aop:横向向抽取 好处:1)

mouserat11的博客 509

Aspect Oriented Programming (AOP) with Spring ,面向切片开发

Spring AOP 是面向切面编程(AOP)在 Spring 框架中的实现,它通过代理机制(JDK动态代理或CGLIB)为方法执行提供增强功能。与AspectJ不同,Spring AOP专注于与IoC容器的集成,采用纯Java实现,无需特殊编译过程。其核心概念包括切面(Aspect)、连接点(Joinpoint)、通知(Advice)和切点(Pointcut),支持5种通知类型:前置、后置、返回后、异常后和环绕通知。Spring AOP适用于大多数企业级应用场景,特别是声明式事务管理等横切关注点,但对于需

RR1335 之代码才是动力源 912

使用Spring进行面向切面编程(AOP)

     摘要: 简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 (这些关注点术语通常称作 横切(crosscutting) 关注点。) Spring的一个关键的组件就是 AOP框架。 尽管如此,Spring IoC容器并不依...

上善若水 116

Spring 的 AOP 的支持

面向切面编程(Aspect-oriented Programming,AOP)通过提供另一种思考程序结构的方法来补充面向对象编程(Object-oriented Programming,OOP)。OOP中模块化的关键单元是类,而AOP中模块化的单元是切面。切面支持跨多个类型和对象的关注点(例如事务管理)的模块化 一、AOP 的概念 AOP 术语 在使用 AOP 之前,先熟悉一下 AOP 概念和术语...

TurboSnail 1890
上一篇: Java 入门:装箱与拆箱
下一篇: 基于 nacos/灰度发布 实现减少本地启动微服务数量的实践
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值