SSM 初探(一)Spring核心知识点

人类的发展很大原因是因为人的惰性
        SSM框架是由Spring,Spring MVC, Mybatis组成,其实就是一栋房子由三种不同颜色的砖搭建起来的意思。每一种砖块都负责这房子的不同部分。比如打地基要用一种材料,建房子主体需要另一种砖块,房顶就需要瓦去装饰了。
        在研究了一段时间的框架之后,发现其中的很多设计灵感都是来源于生活的,就像刚开始说的“人类的发展很大原因是因为人的惰性”,显然,框架都是源于计算机工程师们在开发时候想要进行简化,偷懒而诞生的。
        很多人遇到新的技术就会有种恐惧,认为新技术涉及到自己的盲区,需要自己再次花大量的时间去学习,但是我每次遇到新的技术就会有一种冲动,越新的技术具有前沿的设计理念,也就意味着更容易让人理解,工程师的工作通过新技术可以更加轻松,这样就有更多的时间与家人朋友共处了。
        关于SSM框架的设计目的就是为了将数据,业务,表示的代码分离开来,这样我想改哪一块内容都不用牵扯到其他模块的修改,这就是所谓的解除代码之间的耦合(关联性)。
        Spring模块的核心就是“依赖注入”(dependency injection, DI)与“面向切面编程”(aspect-oriented programming, AOP),再带一个小的概念“控制反转”(Inversion of control, IoC)。
        很多人刚接触到这个概念一头雾水,作为框架新手的我也是和大家一样对于这些新兴的概念感到陌生与不理解。但是我们要记住一点就是任何框架的核心目的就是为了简化开发,减少工程师的工作量,框架变化多端但其中的核心思想是不会变化的。以这样的思维方式去看待新的技术就会有别样的感觉。
        首先是“依赖注入”,从字面上来看就是把所谓的“依赖”灌输到一个类似于容器的东西,如果你刚看到这个词就这么想的话,那么恭喜你,你已经理解了Spring的一部分设计理念了。那么什么是“依赖”呢?“依赖”顾名思义就是双方存在一定的关系呗,这样彼此间才能相互依赖。那么在Java代码里,依赖体现在两个类之间存在互相使用的情况,比如代码1中,在类A里面有个方法new了一个类B,那就可以说类A对类B有一个依赖,因为如果我使用A里面的这个方法,就会创建一个B,这样这两个类不就紧紧绑在一起了么,这两个类紧紧绑在一起也就反映了所谓的“耦合”。

//代码1
class A {
    void createB(){
        B b = new B();
        b.speak();
    }
}

class B {
    void speak(){
        System.out.print("hello");
    }
}

       有一天你想修改类B的一些属性,比如构造器里面传一些参数之类的,那你不仅仅要改类B,你是不是还要去类A里面看看有没有要修改的地方。这样太难受了,万一文件一多,光找类A都要好久呢。所以工程师就想能不能在我想要修改B的时候不需要去寻找其他使用到B的地方呢,这样我就能节省大量的时间专注在对B这个本尊的修改上了,而不用再去管其他地方。这时候“依赖注入”的概念就登场了。
        为什么不把整个B作为形参放到A这个方法的参数里面呢?仔细分析一下下图的代码,看看与上图的初始设计有什么不一样的地方。

//代码2
class A {
    void createB(B b){
        b.speak();
    }
}

class B {
    void speak(){
        System.out.print("hello");
    }
}

        代码2中的代码是将B作为参数传递到A的方法里,避免了使用new关键字新建B的操作。为了体现计算机软件设计的高大上,工程师们就把这种对象作为参数传递到相应的类里行为称为“依赖注入”。“依赖”就是互相关联的对象,“注入”就是把对象作为参数放到相应的方法里面,这样的话如果工程师想要修改类B的参数方法,不管怎么修改都与类A无关了。这样很轻松就达到了降低“耦合”的效果,A虽然用到了B,但是B的修改与A的任何操作都无关,“松耦合”意味着开发的简化,工程师们就能提前下班了。
        对于“面向切面编程”,这个词看上去也是符合计算机科学的“高大上”特性,就是看不懂。其实问题的重点在于理解什么是“切面”。切面,顾名思义就是把一块东西切开了之后的那个横截面。试想长条面包,如果就吃面包,干巴巴的不好吃,那么你就会寻思如何向面包里加入一些佐料,很简单的方法就是将面包切开,像做三明治那样加入火腿片,或者芝士片,这样面包的味道就很棒了。如果你理解了这个,那么你就已经理解了“面向切面编程”的核心了。试想一个软件系统,把它比作一个长条面包,今天我想吃火腿面包,那我只要切开面包,把火腿片加到切面处就可以了,明天我又想吃芝士夹心的面包,那只要切开面包加入芝士片就可以了。火腿片,芝士片就可以抽象成系统中重复的功能代码,把它们封装起来成为固定的火腿片,芝士片,想吃的时候只要取出放到切面里就可以了,这样简化了做不同口味面包的过程,而且你如果想吃多块火腿片也是十分容易的,在需要加入火腿片的地方切上一刀放入火腿片即可。“面向切面编程”就是把一些可以重复使用的功能抽取出来做成火腿芝士片(高大上一点的说法就是把遍布软件各处的功能分离出来形成可以重用的组件),在软件的某些位置需要使用的时候直接插入进去就可以了,这样就能使得软件架构更加清晰,从而降低了系统的复杂性,对于工程师来说,越简单的系统越好,正如格言“Make things stupid”阐明的那样。
        最后一个概念是“控制反转”,这个是最容易理解的概念。我们可以把这个词拆分成“控制”与“反转”。如果你写过Java代码,对于对象的创建肯定是非常熟悉的,就是采用new关键字,比如写烂大街的Person p = new Person();这行代码就是新建了一个名字为p的Person对象。那么设想一下,每次你要使用这个对象的时候是不是都需要采用new关键字进行创建之后,才能使用对象内部的功能。工程师的惰性又来了,我要是能够想用对象的时候直接用该多好,我不想对着满屏幕的new关键字发呆了,每次new完还要考虑什么时候销毁这个对象,这种编码令人头大。如何解决这个问题呢?
        为什么不设计一个机器人,把所有要用的对象交给它,每次我要用哪一个对象的时候,和这个机器人说一声,这个机器人就能很准确的拿出这个对象交到我手上,就像一个仓库管理员一样,我们只负责提货,而不用每次都想办法如何搞到想要使用的对象了。这就是“控制反转”,将对创建对象的“控制权”从我们工程师手上“反”交给机器帮助我们去创建,我只需要机器帮我创建完对象然后交给我使用就可以了。这是一种设计思想,所谓的“反其道而行之”,体现了软件设计领域的一大高招。
        综上所述,Spring没有什么难的地方,要始终记住,框架等新技术的诞生都是为了简化开发的,而不是为工程师增加负担的,其核心思想是不会改变的,越新的技术反而越简单,坚信这一点就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值