java框架开发技术之Spring——AOP

java框架开发技术之Spring——AOP

AOP(Aspect Oriented Programming),面向切面编程,是OOP的延续。可以通过预编译的方式或运行时动态代理的实现在不修改源码的情况下给程序动态的添加一些额外的功能。OOP是面向对象的编程,它是将功能模块化,对象化,一切皆对象,而AOP的编程思想可以简单的理解为是针对同一类问题的统一处理,AOP为一种“横切”技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

AOP使用场景
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
原文链接:https://blog.csdn.net/moreevan/article/details/11977115/

AOP实现的方式

① 动态代理的方式:利用消息拦截的机制,对拦截到的信息进行装饰,以取代原有的方法执行。
② 静态织入的方式:引入特定的语法创建“切面”,从而使编译器可以在编译期间织入有关“切面”的代码。

相关概念说明
Join point(连接点)是程序执行中一个精确的执行点,例如类中的具体的方法即为一个连接点
Point cut(切入点)是对连接点的具体描述,即为一个方法的具体结构
Advice(通知)是在切面中具体织入的一些代码
Aspect(切面)Aspect(切面)
Weaving(织入)将通知放置到切入点的过程

Spring中的AOP实现使用的技术

(1)JDK动态代理
底层使用java的反射机制
设计模式–代理模式:三要素
① 必须要有代理接口
② 必须有一个代理目标类,该类实现代理接口
③ 必须有一个代理类,该类也实现代理接口
注意:如果使用JDK动态代理则必须要存在接口。
(2)CGLIB
CGLIB是一个开源的项目,是一个强大的、高效的、高质量的代码生成库。
实现原理:生成目标类的子类,然后在子类中重写父类的方法来进行实现AOP。
注意:目标类不能被final修饰;目标方法也不能被final修饰。在Spring中首先选择JDK动态代理实现AOP,若不存在接口则使用CGLIB进行实现AOP。

Spring中使用AspectJ(框架)进行AOP实现

AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ。
配置AOP
① 在配置文件的头文件中添加aop命名空间和验证文件;

<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

② 配置切入点/切面/通知

<!-- 配置AOP -->
<aop:config>
	<!-- 配置切入点:expression:AspectJ类型的表达式,主要用来定义切入点-->
    <aop:pointcut expression="args(..)" id="point"/>
	<!-- 配置切面-->
	<!--advice:注入到class文件中的代码。典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。 除了在方法中注入代码,也可能会对代码做其他修改,比如在一个class中增加字段或者接口。-->
	<aop:aspect ref="myAspect">
	    <!-- 定义通知类型-->
		<aop:before method="before" pointcut-ref="point"/>
		<aop:after method="after" pointcut-ref="point"/>
		<aop:after-returning method="afterReturing" pointcut-ref="point" returning="returing"/>
		<aop:after-throwing method="afterThrowing" pointcut-ref="point" throwing="e"/>
		<aop:around method="around" pointcut-ref="point"/>
	</aop:aspect> 
</aop:config>

定义通知类型

AspectJ中的五种通知类型说明
before添加在目标方法之前
after添加在目标方法之后
afterReturning在目标方法正常执行结束后调用的通知
afterThrowing在目标方法异常结束后调用的通知
around在目标方法之前和之后都会调用的通知

使用注解的形式配置AOP

配置注解扫描
@Component:创建对象
@Aspect:代表当前的类是一个切面类
@Pointcut(“args(…)”):代表定义切入点,切入点的方法就是一个普通的无参的空方法
@Before(“point()”)

小总结:

**关于面试官问到IOC和AOP的思想时?

IOC(Inversion of control)控制反转,IOC的主要思想:它描述的是java开发领域中对象的创建以及管理的问题,“控制”指的是对对象进行实例化和管理的权利,“反转”指的是将控制权交给Spring框架、IOC容器这样的外部环境,你只需要在spring配置文件中配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。。简单来说就是我们丧失了一个权利,创建管理对象的权利,而得到的好处是不用再考虑对象的创建和管理等一系列工作,将这个管理权交给了第三方。这样做的好处是不仅让对象之间的耦合度(依赖程度)降低,而且使得资源变得易于管理。

通过例子理解:使用IOC的思想,在开发过程中,我们不用通过new关键字来创建对象,而是通过IOC容器(Spring框架)帮助我们实例化对象。例如针对 User 的操作,利用 Service 和 Dao 两层结构进行开发,在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的具体实现的话,需要通过 new 关键字在UserServiceImpl 中手动 new 出 IUserDao 的具体实现类。这种方式也是可以实现的,但是开发过程中突然接到一个新的需求,针对IUserDao 接口开发出另一个具体实现类。因为 Server 层依赖了IUserDao的具体实现,所以我们需要修改UserServiceImpl中 new 的对象。如果只有一个类引用了IUserDao的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了IUserDao的具体实现的话,一旦需要更换IUserDao 的实现方式,那修改起来将会非常麻烦。使用 IoC 的思想,我们将对象的控制权(创建、管理)交有 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了。

IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)

AOP(Aspect oriented programming)面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。oop的思想是一种垂直纵向的继承体系,可以解决大部分代码的重复问题,但是在横向面,例如对一个类中多个方法的相同位置出现的重复问题,OOP则解决不了,而AOP是一种横切抽取思想,在不改变业务逻辑的情况下解耦合横切逻辑代码,避免重复。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值