Spring学习3、AOP概述

AOP:(Aspect Oriented Programming) 面向切面编程
基于oop(面向对象编程)基础之上的新的编程思想
指在程序运行期间,将某段代码 动态的切入到指定方法的指定位置来运行这种编程方式,即面向切面 编程;

场景:计算器运行计算方法时进行日志记录
我们希望业务逻辑(核心功能)和日志记录分开,即在核心功能运行 期间,日志记录功能能 自动加上。
可使用动态代理来将日志代码动态在目标方法执行前后先执行、

动态代理:JDK默认的动态代理写起来难,而且如果目标对象 没有实现接口,是 无法创建动态代理对象的。

Spring实现了AOP功能 ,其底层就是动态代理 ;
1、可以利用Spring一句代码都不写的去创建动态代理;
2、实现简单 ,而且没有强制要求目标对象必须实现接口;
即将 某段代码(日志)动态的切入 (不把日志功能写到业务 逻辑方法中去)到指定方法 (加减乘除 计算)的 指定位置(方法的开始 、结束、异常。。。)进行运行的 这种 编程方式

———————————————————————————————————

AOP几个 关键术语

切面类:将需要切入的方法(比如:日志记录方法)保存在切面类中
通知方法 :即需要切入的方法
连接点:每一个方法 的 每一个位置
切入点 :需要执行切入方法的 位置,∈连接 点
切入点 表达式:在众多连接点 中选出感兴趣的 切入点(可以理解为 sql语句选择指定的内容 )

————————————————————————————————————————————

AOP使用步骤 :

1) 导包;

Spring核心包: spring-beans-4.3.18.RELEASE.jar
spring-context-4.3.18.RELEASE.jar spring-core-4.3.18.RELEASE.jar
spring-expression-4.3.18.RELEASE.jar spring-aop-4.3.18.RELEASE.jar

AOP所需包: spring-aspects-4.3.18.RELEASE.jar

AspectJ:Java社区里最完整最流行的AOP框架。
在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。
//还需导入额外的jar包,不属于spring官方 但是便于开发
加强版的面向切面编程包(即使目标代码没有实现接口也可实现动态代理)

com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

2) 写配置;

1、将目标类和切面类(封装了通知方法(在目标方法执行前后执行的方法)加入到IOC容器中
@Component
2、告诉Spring哪个类是切面类 : @Aspect
3、告诉Spring切面类中的每个方法何时运行
@Before : 目标方法开始之前运行
@After : 目标方法结束之后运行
@AfterReturning: 目标方法正常返回之后运行
@AfterThrowing: 目标方法抛出异常之后运行
@Around:环绕

切入点表达式:(告诉切面类的方法在哪个切入点运行)
execution( 访问权限符 返回值类型 方法全类名)

注:切面类中的切面方法要配置在哪个方法前后运行是在该切面方法上配置的,利用execution指定配置到哪个方法或者哪个类中去;
示例:
要使log方法在MyMathCalculator类中的add()方法执行之前先执行,就在log方法上添加注解
@Before(“execution(public int com.atguitu.impl.MyMathCalculator.add(int,int))”)
public void log() {…}

注:JoinPoint接口是针对一个连接点而言,可以保存这个连接点的各种信息,比如连接点所在方法的方法名,当前传入的参数数组等信息,都封装在Joinpoint接口中,在通知方法中传入JoinPoint接口,即可在方法内获得这些信息。比如获取连接点对应方法的传入参数、获取方法的返回值等等。

4、开启基于注解的AOP模式:在xml配置文件中写上
aop:aspectj-autoproxy </aop:aspectj-autoproxy>

3) 测试 ;

创建IOC容器,调用方法。

Calculator bean = ioc.getBean(Calculator.class);
bean.add(2,1)

AOP使用场景:
1、AOP加日志保存到数据库;
2、AOP做权限验证;
3、AOP做安全检查;
4、AOP做事务控制;

AOP补充细节

以XML方式配置切面

1 概述
除了使用AspectJ注解声明切面,Spring也支持在bean配置文件中声明切面。这种声明是通过aop名称空间中的XML元素完成的。
正常情况下,基于注解的声明要优先于基于XML的声明。通过AspectJ注解,切面可以与AspectJ兼容,而基于XML的配置则是Spring专有的。由于AspectJ得到越来越多的 AOP框架支持,所以以注解风格编写的切面将会有更多重用的机会。
2 配置细节
在bean配置文件中,所有的Spring AOP配置都必须定义在aop:config元素内部。对于每个切面而言,都要创建一个aop:aspect元素来为具体的切面实现引用后端bean实例。
切面bean必须有一个标识符,供aop:aspect元素引用。

3 声明切入点
l 切入点使用aop:pointcut元素声明。
l 切入点必须定义在aop:aspect元素下,或者直接定义在aop:config元素下。
Ø 定义在aop:aspect元素下:只对当前切面有效
Ø 定义在aop:config元素下:对所有切面都有效
l 基于XML的AOP配置不允许在切入点表达式中用名称引用其他切入点。

4 声明通知
l 在aop名称空间中,每种通知类型都对应一个特定的XML元素。
l 通知元素需要使用来引用切入点,或用直接嵌入切入点表达式。
l method属性指定切面类中通知方法的名称

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值