Spring 两大核心 IOC 和 AOP
如果你的简历上写着Spring (请详述一下spring的两大核心)这个问题一定会被问到。
一、什么叫IOC
1. IOC 全称(Inversion of Control)-- 控制反转。
IOC 只是一种设计思想,具体实现是 DI (Dependency Injection)-- 依赖注入
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
2. IOC能干什么
它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
3. DI 全称(Dependency Injection)-- 依赖注入
组件之间依赖关系由容器在运行期间决定,即容器动态的将某个依赖关系注入到组件之中。 理解DI也要从两方面去理解:
●“谁依赖谁,为什么要依赖”:应用程序依赖于IOC容器,因为需要IOC容器来提供对象需要的外部资源。
●“谁注入谁,注入了什么”:将IOC容器注入应用程序的某个对象,注入了某个对象所需要的外部资源。
通俗来讲就是当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中
创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者。
二、 什么叫AOP
1. AOP 全称(Aspect Oriented Programming)-- 面向切面编程
面向切面编程(aop)是对面向对象编程(oop)的补充
2. AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
核心原理:使用动态代理的设计模式在执行方法前后或出现异常常做加入相关逻辑
1)事务处理:执行方法前开启事务,执行完成后关闭事务,出现异常后回滚事务
2)权限判断:在执行方法前,判断是否具有权限
3)日志:在执行前进行日志处理。
2. Spring AOP 原理:JDK动态代理
动态代理实现原理:一个实现接口的类可以做动态代理。我们需要实现的步骤是:
首先再写一个方法实现一个InvocationHandler接口,方法调用会被转发到该类的invoke()方法。
然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。
以上是JDK动态代理的实现,我们在实现了invocationhandler接口的invoke方法中可以实现我们的逻辑操作,类中需要接口引用,带有接口引用为参数的有参构造方法,重写invoke方法
在我们需要代理的时候写入这些代码
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler)
参数1,实现接口也就是代理对象的类加载器
参数2,实现的接口
参数3,实现invocationhandler接口的类
因此,JDK代理会把所有实现接口的方法转发到invocationhandler中的invoke方法中,我们可以在这里实现任何的逻辑要求