IOC
ioc是一种设计思想,指的是将程序中原本有我们手动创建对象的控制权,在使用spring后,将这个控制权交给spring容器进行控制管理,由spring来管理对象的生命周期和对象的依赖关系。
ioc由专门的容器来创建对象,将所有的类都方法哦spring容器中,当我们需要某个对象的时候,不在需要自己主动去new了只需要告诉spring容器,然后spring容器就会把对应的对象返还给你。
传统的应用程序都是由我们在类内部主动创建依赖对象,从而导致类的耦合度高,有个springioc之后把创建和查找依赖对象的控制权交给了容器,由容器进行依赖对象的注入,所以对象与对象之间是松耦合的,有利于功能复用,更重要的是是的程序的整个体系结构变得非常灵活。
ioc容器就像是一个工厂,当我们需要创建一个对象的时候只需要配置好配置文件或者注解即可。完全不用考虑对象是如何创建出来的
DI指应用程序在运行时依赖IOC容器来动态注入组件所需要的某个对象,spring的di就是通过反射来注入的,反射允许程序在运行的时候动态生成对象,执行对象的方法,改变对象的属性。
应用程序依赖ioc容器
应用程序需要ioc容器提供组间需要的外部资源
注入的是应用程序依赖的对象
注入某个对象所需要的外部资源
通过依赖注入我们只需要简单配置,而无需任何代码就可指定目标需要的资源
ioc理解:就是将我们原来手动去生成的对象的控制权都交给spring容器进行控制管理以及管理对象的生命周期。依赖注入是实现ioc的方法。
AOP
面向对象有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时例如日志,我们只能在每个对象里面引用公共行为这样就产生了大量重复代码以及耦合度高,所以就出现了现象切面编程AOP关注的方向是横向的。
aop是指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式,可以说是OOP的补充和完善。
aop中的关键字:
1.通知(Advice)
就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。@after,@before
2.连接点(JoinPoint)
这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。你想要处理的方法
3.切入点(Pointcut)
上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。@Pointcut 你想要在那些地方添加通知所写的表达式
4.切面(Aspect)
切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。@Aspect注解的类就是一个切面
5.引入(introduction)
允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
6.目标(target)
引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
7.代理(proxy)
怎么实现整套aop机制的,都是通过代理,这个一会给细说。
8.织入(weaving)
把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。
关键就是:切点定义了哪些连接点会得到通知
aop总结:
- AOP的出现是为了对程序解耦,减少系统的重复代码,提高可拓展性和可维护性。
- 常见的应用场景有权限管理、缓存、记录跟踪、优化、校准、日志、事务等等等等……总之AOP的使用是非常常见的。
- 需要注意不同Spring版本之间的AOP通知顺序是有差别的。补充:Spring5.28为分界线。
- 环绕通知很灵活、强大,但是也就意味着很难控制,如非必要,优先使用其他通知来完成。
- 多切面作用同一个切点时候注意切片顺序。