一、SpringAOP
1.SpringAOP
SpringAOP(Aspect Oriented Programming )即面向切面编程,其作用就是对方法进行增强,在不改变源码的情况下,增加方法新的功能。
要了解SpringAOP就要先了解这几个点:
连接点(Joinpoint):在程序运行过程中,通常会调用方法,在SpringAOP中调用方法这个点就是我们的连接点。
切入点(Pointcut): 可以插入增强处理的连接点。有了连接点后,如果该连接点满足要求,就对其添加增强处理,这个点也就可以称为切入点,切入点可以是该方法执行前、后、前-后等。
切面(Aspect ):切入点和通知的结合
植入(Weaving ):把增强处理植入在方法执行前、后、前-后、抛出异常后等。
通知/增强处理(Advice): 在特定的切入点添加增强处理,即扩展方法功能。
代理(Proxy ):为对象提供一种代理以控制对这个对象的访问(现在只是将代理这个概念 ,SpringAOP中的代理将在后面说明)。比如,猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。再例如
这是一个接口
这是这个接口的实现类
这是直接调用接口这个对象,而输出结果如下
可以看出,这里调用输出的是实现类PhoneServiceImpl的select()方法,这也就是代理,通过子接口的代理,来实现测试类中对PhoneService的select方法调用,这里要说明一下,@Service,已经把代理类写入了bean中,在@Autowired注入的就已经是实现类了,只是外貌是接口类的外貌。
通过上述所描述的点,再给大家说明一下SpringAOP中的代理
首先创建一个切面类
这里说明一下这里 execution([修饰符]返回值类型包名.类名.方法名(参数))还有我的项目结构,这里就定义了一个切面类,切面类里面的execution表达式则是用来表示要拦截哪些方法,@Around注解植入表示在该方法执行前,做什么,以及改方法执行后做什么。 在这里,我也就说明一下SpringAOP中的代理,在我们execution拦截到方法的时候,自动生成了一个代理类,并在其中嵌入切面提供的通知(即增强方法),这些通知方法会被应用到目标对象的方法中,从而实现了对目标对象的增强。也就是外表是执行的该方法所属的类,实际上执行的是代理类
代理对象的方法=增强处理+被代理对象的方法
这里应该还有点疑惑,为什么不直接增强拦截的方法,而要一个代理类。因为这种设计模式通过生成一个代理类来提供对目标对象的额外访问方式,而无需修改原目标对象。这样一来,我们就可以在不改变原有代码结构的前提下,为业务方法添加额外的功能。重点是不改变原有代码结构。
接下来,完整的给大家走一遍SpringAOP执行流程
首先,创建一个配置类、接口和实现类、测试类
这里@Service会将PhoneServiceImpl装载在Bean中
@Autowired将代理PhoneServiceImpl注入到phoneService中,执行select方法,就相当与调用PhoneServiceImpl中的select()方法,而Service包下的PhoneServiceImpl类的select()方法被切面类拦截,生成代理类,进行 增强处理+被代理对象方法+增强处理 这里增强处理按照植入关系进行前后增强处理。最后输出最后补充一点知识点
在Spring AOP中,有两种主要的代理模式:JDK动态代理和CGLIB代理。
JDK动态代理主要应用于目标对象实现了接口的情况。在这种情况下,Spring AOP会创建一个实现这些接口的代理类,并在其中重写接口中的方法。同时,Spring AOP会将目标对象注入到这些方法中。另一种是CGLIB代理,它主要应用于目标对象没有实现接口的情况。在这种情况下,Spring AOP会使用CGLIB库来创建一个代理对象,这个对象会包含目标对象的全部方法,包括那些非公开的方法。
之前所述例子就是JDK动态代理。