Ⅰ。Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一。其发展历史从学术领域和研发机构的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中。使用Spring框架固然给我们的编程带来了好处与便利,但是同时存在着一个问题,对于初学者来说,所谓的“控制反转”,不是一个能够望文生义的好名称,“依赖注入”也是一样,也正是因为这样,不少初学者很难在短时间内理解和掌握这些名字和他们的用法,而要使用AOP的功能也需要理解AOP,也比较难。基于以上原因,我们就会想到,能否简单地将Spring框架中运用到的优秀的理念,巧妙的运用到我们需要使用的地方,而又绕过不容易上手的Spring框架,做到一举两得呢?本文就将围绕着上述提出的问题给出作者的看法和观点。
AOP实际是GoF四人组设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,增加程序的灵活性和可重用性,AOP实际上就是设计模式所追求的目标的一种实现。所谓的分离关注就是将某一通用的需求功能从不相关的类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。AOP就是这种实现分散关注的编程方法,它将“关注”封装在“方面”中。面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。AOP和OOP虽然在字面上十分相似,但是却是面向不同领域的两种设计思想。OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而AOP则是针对业务处理过程中的切面进行提取,例如,某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用AOP将贯穿于各个模块间的横切关注点自动耦合进来。AOP所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。使用AOP机制进行开发,首先要对方面进行了解,将需求分解成一般关注点和横切关注点,即将核心模块级的关注点和系统级的横切关注点分离;然后各自独立的实现这些关注点;最后用工具将业务逻辑代码和横切关注点代码编织到一起,形成最终的程序。通过面向方面的编程可以减少编码时间和重复。
Ⅱ。AOP常用术语
Aspect 切面:它是横跨多个核心逻辑的功能,或者称之为系统关注点,例如日志记录、安全检查、事务管理等。以前我们在一个组的每一个方法重复编写这些代码。现在我们将这些散落的代码集中起来,放在一个模块中,这个模块(例如,日志记录)就中一个切面。
Joinpoint 连接点:连接点主是定义在应用程序的何处插入切面的执行,最容易想到就是一个方法调用时,或者在访问一个字段时,或者在抛出异常时。
Pointcut 切入点:切入点就是一组连接点的集合。例如,一个切面需要在调用每个以query开头的方法时执行,就可以用正则表达式(.*query.*)或通配符(query*)来表达这一组的连接点,我们将之称为切入点。
Advice 增强:在特定连接点上执行的动作,执行这个动作就相当于对原始对象的功能做了增强。
Introduction 引介:为一个已有的java对象动态增加新的接口。这个功能看起来有点玄乎,实际也是AOP的一种功能。
Weaving 织入:将切面组织到程序的执行流程中。
Interceptor 拦截器:如何实现增强的一种方式。
Taget Object 目标对象:真正执行核心逻辑的对象。
AOP Proxy 代理:AOP代理就是客户端持有的引用。由于AOP代理实现了与目标对象同样的接口,因此客户端感觉不出这两者的区别,但是却获取增强的额外功能。
Ⅲ。在Spring装配AOP
Spring大力提倡使用依赖注入的方式来装配Bean,对于AOP也不例外,依赖注入仍是极具杀伤力的武器。Spring提供了ProxyFactory来实现AOP的装配,免去了以编程方式生成AOP代理对象的繁琐步骤,这也是Spring AOP的设计目标之一。Spring 常用的Advice如下①MethodBeforeAdvice:在方法执行前开开始增强。②AfterReturningAdvice:在一个方法执行完毕后增强。③ThrowsAdvice:在一个方法抛出异常时增强。④MethodInterceptor:在一个方法增强前后增强。下面这个是学习的例子,可以供大家学习参考:
UserDao负责访问数据库,这里使用Map来模拟数据库。
UserService定义了用户管理的接口中,它仅有两个方法。
UserServiceImpl则实现了UserService接口中,它需要注入一个UserDao来完成业务方法。
先创建一个LoginMethodBeforeAdvice,用于记录所有login()方法的调用。记录用户尝试登录的信息。
用LoginAfterReturningAdvice用户记录已经成功的用户。
如果用户登录失败,login方法将会抛出异常,因此,LoginThrowsAdvice用于记录登录失败的情况。
有了目标Bean和Advice后,就可以编写config.xml配置文件,将其在Spring的IoC容器中装配起来。
编写测试类Main.class来测试我们在Spring的IoC容器中配置的AOP
运行测试结果,可以看到如下输出:
如果正常返回,则ThrowsAdvice将不会被执行,因为没有异常抛出,自然不会引发ThrowsAdvice执行;如果方法抛出了异常,则ThrowsAdvice将被执行,而AfterReturningAdvice就不能被执行,因为当异常抛出时,方法是没有任何返回值 的,自然无法执行AfterReturningAdvice。
例2:编写Advisor的例子
是在上一个工程扩展的例子,演示如何使用Advisor来截获指定的方法。
新增CreateAfterReturningAdvice.class,用于对create()方法增强。
LoginMethodBeforeAdvice不变。
下面需要做的就是将Advice封装为Advisor,需要用NameMatchMethodPointcutAdvisor来定义LoginMethodBeforeAdvice,应当仅仅作用于login()方法,然后使用RegexpMethodPointcutAdvisor来定义CreateAfterReturningAdvice应当作用于所有以create开头的方法。最后将这两个Advisor装配起来。config.xml如下:
为了验证这两个Advisor是否对特定的方法进行了增强,我们在main()方法中调用UserService的不同方法。
运行结果如下:
可见,create()方法和login()方法分别被createAfterAdvisor和loginBeforeAdvisor增强,这校们就实现了特定的方法的增强,而不是对所有方法都增强。
分享到:
相关推荐
本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...
Spring Aop 学习笔记
**Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...
,文章属于基础级文章,适合入门级的小伙伴,它的概念,应用场景,实现原理及Spring的AOP的开发。全称:面向切面编程(AspectOrientedProgramming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。...
Spring框架是Java开发中不可或缺的一部分,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,以及用于构建Web应用程序的MVC框架。Spring Boot则是基于Spring框架构建的应用程序启动器,旨在简化...
本笔记主要探讨了如何在Spring应用中使用AOP来实现横切关注点,如日志、事务管理、性能监控等。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切面由两个主要...
这份"Spring框架学习笔记"涵盖了Spring框架的基础知识、核心组件以及高级特性,对于初学者来说是一份宝贵的资料。 一、Spring框架概述 Spring框架是为了解决企业应用开发的复杂性而设计的,它提供了一个全面的基础...
马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
在本次的Java Spring框架学习笔记中,将对Spring框架的核心概念进行详细解析,包括Spring的 IOC(控制反转)、AOP(面向切面编程)、jdbcTemplate、事务管理、Spring5新特性以及与Mybatis的整合。本学习笔记提供了...
标题和描述均提到了“spring指南学习笔记”,这意味着文档聚焦于Spring框架的学习心得与关键概念。Spring是一个开源的Java企业级应用框架,以其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...
### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...
这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...
Spring框架是Java应用开发中广泛使用的轻量级框架,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,提供了丰富的功能,包括但不限于组件管理、AOP(Aspect Oriented ...
Spring入门学习笔记,内容包括Spring介绍,Spring配置文件,Spring配置数据源,Spring的注解开发,Spring集成Junit,Spring的AOP,jdbcTemplate介绍,Spring控制事务流程,Spring集成web。
以下将详细介绍Spring学习笔记中的主要知识点。 **面向抽象编程** 面向抽象编程是一种设计原则,强调在代码中使用接口或抽象类,而不是具体实现类。这使得系统更具有灵活性,易于扩展和维护。在Spring框架中,我们...
根据提供的压缩包文件名,我们可以推测这是一个逐步学习Spring的系列笔记。从"Spring_day1"开始,可能涵盖了Spring的基础概念、环境搭建和基本配置。"Spring_day2"可能涉及了依赖注入和AOP的深入讲解。"Spring_day3...
总之,《Spring技术内幕 学习笔记》涵盖了Spring框架的众多核心知识点,从IoC容器、AOP到Web开发和数据访问,对于提升Spring开发技能具有很高的价值。通过深入学习和实践,开发者能够更好地理解和掌握Spring框架,...