spring核心原理猜测

说是猜测,实在是我也没彻底研究过

 

由于前几日面试官突然砸过来这么个问题:“说说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实现最小侵入性,因为不需要直接将代码嵌入业务逻辑中,而只需要在代理实例中处理即可。

 

我大致的理解就是这样了,先记录下想法,后续验证

posted @ 2017-02-23 22:30  gabin  阅读(256)  评论(0编辑  收藏  举报