一起理解IOC and AOP

IOC

IOC Inverse of Control 控制反转,是 一种思想:传统的JavaEE通过new来创建对象,是程序主动的创建对象。IOC是指通过第三方-容器(BeanFactory)来帮忙管理对象(创建,包装,依赖注入)。降低耦合关系。

IOC通过反射机制实例化对象,需要消耗一定的性能;在服务启动时候完成加载,不会影响业务功能。

DI

依赖注入。组件之间依赖关系由容器在运行期决定,容器动态的将依赖对象注入到组件中。填充属性——初始化类中的属性对象。

联系

在IOC基础上返回实例化对象后,通过DI填充注入属性,完成一个对象的创建过程。

循环依赖

A对象中有成员变量B,B对象中有成员变量A;创建A或者B对象存在循环依赖,报错StackOverflowError。Spring使用三级缓存解决循环依赖。注意只能是单例的对象才支持依赖注入。

  1. 一级缓存:用于存放完全初始化好的bean;
  2. 二级缓存:存放原始的bean对象(尚未填充属性),用于解决循环依赖;
  3. 三级缓存:存放 BeanFactory,用于解决循环依赖

简要过程:

  1. A 创建过程中需要B,于是A将自己放入三级缓存中,去实例化B;
  2. B实例化时候发现需要A,于是依次从一级 ->二级 ->三级缓存中查找;
  3. 把三级缓存中的A放入二级缓存中,并删除三级缓存里面的A;
  4. B完成初始化,将自己放入一级缓存中;
  5. A继续初始化,从一级缓存中拿到B,完成创建,将自己放入一级缓存中。

AOP

Aspect-Oriented Programming 面向切面编程。Java面向对象过程中,遇到重复代码可以通过抽取方法和抽取类的方式实现复用。AOP就是通过横向切割的方式抽取共性代码,减少代码侵入性,统一管理。开发者可以在不改变原来业务代码的基础上完成增强功能(添加日志,事务,异常处理等)。

AOP思想实现技术

  • AspectJ :静态代理,编译时增强,不影响业务方法;
  • Spring AOP :动态代理,在运行期对业务代码完成增强,在内存中生成中间子类

Spring AOP 实现原理

定义切面,包括通知和切点。切点Pointcut,定义什么地方织入增强,定义通知,什么时候使用;通知类型(Before,After,After-returning,异常通知 After-throwing,环绕通知 Around)。

动态代理

  • jdk动态代理:通过实现被代理类的接口和InvocationHandler接口,Proxy对象通过反射机制实现增强。
  • cglib动态代理 :采用字节码技术,创建一个子类,并在子类中拦截父类的方法,织入完成增强功能。因此final 和private的类,方法不能被重写。

最后

夏天到,卖桃子,秋天到,卖苹果。

一起理解IOC and AOP_第1张图片

你可能感兴趣的:(Spring,aop,ioc)