谈谈Spring Aop的理解

一:SPring Aop是什么?

Spring aop全称  aspect object pramming 又叫面向切面编程

1.面向切面编程是指 对很多功能都有的重复代码进行抽取,并在运行的时候往业务相应的方法上植入“切面类代码”,

重复代码,在spring aop中被称为关注点;

常见的关注点:比如我们写一个功能模块,增,删,改,那么我们这些方法都有相同的地方,比如,开启事务,提交事务,关闭事务,那么我们就可以把这些重复代码提取出来放到另外的类中,那么这个类由关注点组成,就叫切面类

切入点:

  • 执行目标对象方法,动态植入切面代码。
  • 可以通过切入点表达式指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码

切入点表达式:

  • 指定哪些类的哪些方法被拦截(就是说执行哪些方法的时候拦截并执行切面类中的代码)

 

2,aop的优点:

aop把一些重复代码拿出来放到特定类中,只写一次,我们只需要关注业务逻辑代码,不必每次重复写这些代码,降低了代码的耦合性,提高了隔离性,

3.aop的一些名词:

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 切点 以及相应的 Advice。
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在代理对象 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在加入的目标对象之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。
  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced 对象的过程

3.aop的实现过程:

我们将重复代码放入切面类后,然后利用aop将其与代理对象(Spring容器生成的都是代理对象)关连起来,等到执行特定方法的时候来调用切面类中的方法,这个过程中就是由Aop来帮我们完成的,aop会监听表达式中配置的相应方法的运行,并根据织入的对象方法来执行相应的方法(一般有运行前,运行后等)。(Aop的实现的核心机制之一就是动态代理,所以代理对象是绕不过的,顺便说下代理对象,假如我们把一个目标对象加载到spring容器之中,生成的就是代理对象,spring根据目标对象的不同,实现代理对象的方式也会不同,Spring的代理对象分别是采用jdk代理和cglib代理来实现的,假如目标对象实现了接口,那么系统采用的就是jdk方式来实现动态代理,反之,就使用cglib来实现动态代理,jdk实现的代理对象跟目标对象有相同的父类,就相当于平级),而cglib实现的代理对象相当于目标对象的子类,因此如果采用cglib的话目标对象不能使用final来修饰,顺便说一下,如果目标对象实现了接口其实也可以强制使用cglib来实现的,不过一般不这么用),

aop的具体实现:

举个例子:我们在a中(目标对象)定义了一个简单的功能业务,

package cn.oracle.services;

public class ProductserviceImpl {
    //测试无实现接口来完成切面注解
 public void SaveProduct(){
     System.out.println("商品存储进行中");
 }
}

 

然后我们又定义了一个切面类

然后我们将这个切面类和目标类关联起来(也就是织入目标对象),。

测试一下:

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试高级开发的期间整理的面试题目,记录我面试遇到过的spring题目以及答案 目录 spring ThreadLocal的底层对象; 为什么@Service和@Repository放到实现类上面而不是接口类上面; spring 三种注入(就是从spring容器中将bean放入对象属性值中) Spring下描述依赖关系@Resource, @Autowired和@Inject的区别与联系 Spring中BeanFactory和ApplicationContext的区别 谈谈Spring IOC的理解,原理与实现? bean的生命周期,详细看上面 SpringBoot自动装配的过程的原理: spring的缓存; spring是如何解决的循环依赖; BeanFactory和FactoryBean有什么区别; Spring中用到的设计模式; SPI 机制(Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制), 很多地方有用到: AOP SpringAOP的底层实现原理; 为什么jdk动态代理是必须是接口 两种动态代理的区别 AOP实现方式:aop注解或者xml配置;后来工具jar包aspects; aop的属性 事务 事务编码方式: 事务注意事项; 为什么同一个类A调用b方法事务,A方法一定要有事务(编码式的不用) @transaction多个数据源事务怎么指定数据源 传播特性有几种?7种; 某一个事务嵌套另一个事务的时候怎么办? REQUIRED_NEW和REQUIRED区别 Spring的事务是如何回滚的,实现原理; 抽象类和接口的区别,什么时候用抽象类什么时候用接口; StringBuilder和StringBuffer的区别 java值传递和引用传递

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值