关于spring AOP 的初步学习
2017-05-23 17:11
435 查看
最近也是在看spring的东西,像IOC,我们在项目中都是经常在用的,但是AOP,像我这样工作一两年的小白却是只闻其声。
先来看看关于AOP的定义:面向切面编程,算是对面向对象编程(oop)的补充,因为oop一般都是定义纵向的对象关系,一层一层的垒起来,而如果我想在每访问一个方法时print出某个东西肿么办,难道要找出所有的方法,然后在所有方法中依次添加?那此时需求变更之后呢,是不是就GG了。。。所以aop就是干这个的,他能把这些与具体业务不相干但是又不得不加的逻辑代码分离出来,并统一管理,这样就能够减少系统重复代码,降低耦合度。
想象一下,我们需要添加公共代码的地方在球里,我们需要切开,定位到那个位置才能添加,所以我们需要需要一个切面,并告诉系统这个切面在哪里,这差不多就是我理解的面向切面。
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
(PS:我做实例的时候就出现了问题,下表:)
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB。
首先,在运用aop之前,我们还需要下载jar包:aspectj.jar和aopalliance.jar
首先我们需要定义一个类,就是公共代码:
然后在IOC容器中添加AOP的声明和配置
效果:
实际上如果就是这样的话会出现个问题,就是加上aop后,spring会出现原来的bean注入失败。这时必须要修改成
这就是刚才PS里所说的问题,proxy-target-class属性值决定是基于接口的还是基于类的代理被创建,我的是基于类的,所以将这个属性的值变成true,默认是基于接口的false
先来看看关于AOP的定义:面向切面编程,算是对面向对象编程(oop)的补充,因为oop一般都是定义纵向的对象关系,一层一层的垒起来,而如果我想在每访问一个方法时print出某个东西肿么办,难道要找出所有的方法,然后在所有方法中依次添加?那此时需求变更之后呢,是不是就GG了。。。所以aop就是干这个的,他能把这些与具体业务不相干但是又不得不加的逻辑代码分离出来,并统一管理,这样就能够减少系统重复代码,降低耦合度。
想象一下,我们需要添加公共代码的地方在球里,我们需要切开,定位到那个位置才能添加,所以我们需要需要一个切面,并告诉系统这个切面在哪里,这差不多就是我理解的面向切面。
AOP的核心概念:
1、横切关注点对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:(PS:我做实例的时候就出现了问题,下表:)
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB。
首先,在运用aop之前,我们还需要下载jar包:aspectj.jar和aopalliance.jar
首先我们需要定义一个类,就是公共代码:
public class demo { public void printTime(){ System.out.println("你好,我打印出来了"); } }
然后在IOC容器中添加AOP的声明和配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <bean id="indexaction" class="action.IndexAction"/> <bean id="demotime" class="action.demo"/> <aop:config> <aop:aspect id="time" ref="demotime">//定义一个切面 <aop:pointcut id="addAllMethod" //定义切入点 expression="execution(* action.IndexAction.*(..))" /> <aop:before method="printTime" pointcut-ref="addAllMethod" />//定义在目标切入点执行什么方法 <aop:after method="printTime" pointcut-ref="addAllMethod" /> </aop:aspect> </aop:config> </beans>
效果:
实际上如果就是这样的话会出现个问题,就是加上aop后,spring会出现原来的bean注入失败。这时必须要修改成
这就是刚才PS里所说的问题,proxy-target-class属性值决定是基于接口的还是基于类的代理被创建,我的是基于类的,所以将这个属性的值变成true,默认是基于接口的false
相关文章推荐
- 关于Spring的AOP的学习随记,心情
- Spring 学习之路(八):Spring 中的AOP(一):aop初步了解
- 关于spring AOP的学习
- spring aop初步学习(概念及)
- Spring学习(二)——Spring中的AOP的初步理解[转]
- 17-spring学习-AOP初步实现
- 关于SpringAOP的初步认识(个人理解)
- Spring学习(二)——Spring中的AOP的初步理解
- Spring学习(1)AOP初步—JDK动态代理
- 用代码学习Spring:IoC、AOP(下)
- 用代码学习Spring:IoC、AOP(上)
- spring学习之AOP(一)
- Spring AOP 入门学习
- 用代码学习Spring:IoC、AOP(下)
- Spring学习笔记:关于Interceptor
- spring aop学习的第一个例子
- Spring Aop Step-By-Step 学习笔记(下)
- Spring Aop Step-By-Step 学习笔记(上)
- Spring特点中关于DI,IOC及AOP的个人理解
- 用代码学习Spring:IoC、AOP