说是猜测,实在是我也没彻底研究过
由于前几日面试官突然砸过来这么个问题:“说说Spring的原理”(应该很多做应用开发的人这时候心中万马奔腾了),当时没个头绪,现在想来记录一下便是
提起Spring,大家其实最多谈论的几个关键词是ioc、aop、容器等
IOC(Inversion of Control)本身代表的是依赖倒置,也作:"请别联系我,需要的时候我会联系你"的意思来解(也叫做好莱坞原则,或者也可以叫做大牌原则:别找我,有事我会联系你)
其实这个在前端框架中经常会遇到,特别是JavaScript的框架(一般常见于模块化,因为模块相互独立,需要使用到的时候“联系”下这个模块即可)
例如最近比较火的 angularjs便是如此
那么什么是依赖倒置呢,如果用术语来解释,不仅很多人听不懂,我也不知道如何讲起,索性用些通俗的语言来讲
所谓的依赖倒置,就是:一个cpu它不依托于电脑,因为电脑比cpu更高级,而cpu是组成计算机的一部分。这是所谓的底层组件不依赖高层组件。
也就是常见的模块注入:
app.use(['grid'], function(Grid) { // 这边的Grid对象就是在我需要的时候被加载了,如果我不需要,你爱呆哪呆哪 })
在spring中,可以体现为私有变量不需要通过new来持有对象,而是在需要使用的时候通过容器来注入
说到这,就必须要说到AOP(Aspect Oriented Programming): “面向切面编程”
说是切面,其实没啥太特殊的意思,就是从不同的角度来看待问题的意思
可以这么来理解,我们的业务代码所不需要关注的一面,比如说我们实现了一个支付的代码,但是我们需要在前后记录日志,可是我们又不想要在代码里面切入操作日志
这时候我们就可以使用AOP,它实际上也是种动态代理(实现的原理)
实现的方式就是私有化实际对象,然后在实际方法的调用前后加上新的逻辑代码,如同记录日志,就多半是在实际方法调用的后边来执行
下面是一个简单的代理实现代码,实际上的动态代理就需要用到反射了:
public class Proxy { private RealClass realClass; public void talk() { before(); realClass.talk(); after(); }
}
所故,实际spring使用了工厂模式来作为容器管理,动态去代理bean,实现依赖倒置原则,代理也使得aop切面的操作得以实现。
IOC解决了创建对象的耦合性问题,AOP则帮助Spring实现最小侵入性,因为不需要直接将代码嵌入业务逻辑中,而只需要在代理实例中处理即可。
我大致的理解就是这样了,先记录下想法,后续验证