关于spring AOP 的初步学习
来源:互联网 发布:淘宝多少级能上直通车 编辑:程序博客网 时间:2024/05/17 04:26
最近也是在看spring的东西,像IOC,我们在项目中都是经常在用的,但是AOP,像我这样工作一两年的小白却是只闻其声。
先来看看关于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的aop
- spring aop初步学习(概念及)
- Spring的AOP初步了解(四)
- Spring AOP 初步
- 初步理解spring aop
- Spring AOP初步了解
- spring AOP初步总结
- Spring AOP初步介绍
- Spring 和aop初步
- Spring的AOP学习
- 关于Spring的AOP的学习随记,心情
- 关于AOP的学习
- 关于spring的AOP使用
- Spring学习(1)AOP初步—JDK动态代理
- Spring Boot的初步学习
- spring中的aop初步认识
- Spring的AOP学习笔记
- 个人测试
- 3d全景图
- Unity —— 针对DynamicBone插件的迭代来实现布料模拟
- iOS学习之路10
- spring-session整合redis实现session共享
- 关于spring AOP 的初步学习
- 并查集
- Ubuntu 16.04 Exception: tostring() has been removed. Please call tobytes() instead.
- MySQL高可用方案选型参考
- 洛谷 P1018 乘积最大(NOIp2000提高组第二题)
- Unicode 与 String字符串之间的相互转换
- gridview、listview适配器布局中带有checkbox实现的列表 checkbox只能有一项选中
- windows网络编程(三)——UDP
- Centos下ftp的搭建