IOC
IOC是指Spring框架中的一个模块叫做IOC容器。
IOC又叫控制反转。
指的是将对象的依赖关系交给IOC容器来管理,并且由IOC容器完成对象的注入。
这样可以大大简化开发的效率,并且把应用从复杂的依赖关系中解放出来。
IOC容器就像一个工厂,只要我们写好配置文件或者注解,我们就可以在我们想要的地方随时引用对象。
Spring时期,我们通常使用XML配置文件来配置Bean。
Spring Boot流行后,主要通过注解来配置Bean。
举例:如果你想写一个Service的话,有很多基础的类,每次调用时候都需要初始化,而有了IOC你只需要在你想要用的地方引用即可。
如何配置容器:
1.基于XML配置
2.基于注解的方式
3.基于JavaConfig的方式
AOP
AOP(Aspect-Oriented Programing)面向切面编程,能够将哪些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP的实现对于接口来说使用JDK的动态代理实现的,对于类来说使用Cglib来实现。
JDK动态代理:
JDK的动态代理,就是在程序运行过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。代理的目的是调用目标方法时可以转而执行InvocationHandler的invoke方法,Spring AOP也是在这里组文章,这是典型的代理模式。
为什么JDK动态代理必须基于接口呢而不是继承呢?
- 因为通过JDK动态代理生成的代理类继承了Proxy,由于Java是单继承,只能通过实现接口来实现。
- 从代理模式的设计来说,充分利用了Java的多态特性,也符合基于接口编码的规范。
Cglib代理
使用字节码处理框架ASM,来转换字节码并生成新的类。
Cglib(Code Generlize Library)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明为final。
区别:
1.Cglig是直接转换成字节码来生成新的类,所以速度更快
2.Cglib既可以实现接口的代理也可以实现类的代理
3.JDK只能实现接口实现代理
4.JDK是自带的代理模式,兼容性更好。
Spring AOP和AspectJ AOP有什么区别
- Spring AOP属于运行时增强,而AspectJ是编译时增强。
- Spring AOP基于代理(Proxying)、而AspectJ基于字节码操作。
Spring AOP已经集成了AspectJ,AspectJ应该算Java生态系统中最完整的AOP框架,AspectJ相比于Spring AOP功能更加强大,打死你Spring AOP来说更加简单。
如果切面比较少,那么两者性能差异不大,但是当切面太多,最好选择AspectJ,它比Spring AOP快很多。