SpringAOP

1.背景介绍

spring框架中有两个核心思想是IoC和AOP。AOP中文意思是面向切面编程,和IoC一样,AOP也是为降低耦合度而生的。

AOP中把程序分成核心业务和周边业务,(与核心业务无关却被大多数业务模块所调用的称为周边业务)。

周边业务在AOP里,即被定义为切面。

核心业务功能和切面功能分别独立进行开发 ,然后把它们 "编织" 在一起,这就叫AOP。

 

AOP的作用就是:减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

分布于应用中多处的功能称为横切关注点,通常这些横切关注点在概念上是与应用的业务逻辑相分离的,但其代码往往直接嵌入在应用的业务逻辑之中。将这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的。

 

AOP具体可以在下面的场景中使用:

权限、缓存、内容传递、错误处理、懒加载、调试、日志管理、性能优化、持久化、资源池、同步、事务

 

2.知识剖析

(1)spring的AOP支持

(2)AOP术语

(3)基于xml和注解的配置方式

  ①spring中的AOP的两种代理方式:JDK动态代理、cglib代理,spring默认为jdk动态代理。

1)jdk动态代理:利用反射机制生成一个实现代理接口的匿名类。

2)CGLIB代理:cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

 

原理区别:

JDK动态代理只能对实现了接口的类生成代理,而不能针对类;在创建代理实现类时比CGLib要快,创建代理速度快。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法;创建代理速度比JDK慢,但运行速度比JDK动态代理快。

 

  ②AOP术语

1.连接点(Joinpoint):能够应用通知的点 ,是在应用执行过程中能够插入切面的一个点。在spring中,这些点指的是方法,spring只支持方法级别的连接点,一个类里有多少方法就有多少Jointpoint。

2.通知(Advice):也称为增强。指的是拦截到Joinpoint后你想要扩展的功能,也就是上面说的 安全,事物,日志等。

有五种类型的通知:

Before(前置):在方法被调用之前调用通知;

After(后置):在方法调用之后调用通知;(不管该方法是否执行成功)

After-returning(返回结果通知):在方法返回结果后;

After-throwing(异常通知):在方法抛出异常后;

Around(环绕):在方法调用之前和之后都会调用通知;

3.切入点(Pointcut):指的是我们要对哪个连接点进行拦截的定义。

4.切面(Aspect):切面是通知和切入点的结合。

通知说明了扩展的功能是什么和什么时候扩展,而切入点说明了在哪里进扩展(指定到底是哪个方法),这就是一个完整的切面定义。可以看出切面就是表述的一个过程,就是将增强应用到具体方法上的过程。

5.引入(introduction):引入允许我们向现有的类添加新方法或属性,从而可以在无需修改现有类的情况下,让它们具有新的行为和状态。

6.织入(weaving):是把增强应用到目标的过程。

7.目标(target):代理的目标对象(要增强的类)

8.代理(proxy):通过代理实现整套aop机制的。

 

3.常见问题

问题一:什么情况下会用哪种方式实现动态代理?

1. 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2. 如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3. 如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

 

问题二:编译时增强和运行时增强的区别?

编译时增强属于静态代理,运行时增强属于动态代理。

 

问题三:AOP织入方式有几种?

有三种:编译期织入,装载期织入,运行期织入。

 

问题四:目标是代理接口的时候,可以强制用cglib吗?

对于接口,spring默认使用jdk动态代理,但是可以强制使用cglib。

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页