Spring基础篇——DI/IOC和AOP原理初识

前言

  做为从事java开发的码农,Spring的重要性不言而喻,你可能天天都在和Spring框架打交道。Spring恰如其名的,给java应用程序的开发带了春天般的舒爽感受。Spring,能够说是任何一个java开发者通往技术高阶的必备基础。固然,要学好Spring,尤为是了解Spring的底层原理并不容易,须要花费不少时间和精力来潜心的研习,并在实际的项目中不断的试错和总结,才能造成属于本身的思惟理解。博主对Spring最初的认识颇浅,项目中遇到问题依靠度娘大概也能笼而统之的解决。不过呢,接触Spring这么一年多时间里,对框架体系认知比较杂乱,深层技术依然是雾里看花通常,没有造成本身的认知和理解,这对编程技术的提高是十分不利的。鉴于此,才决定静下心来从头到尾系统的学习Spring框架,并经过博客的形式记录学习点滴,分享技术知识,算是抛砖引玉吧。好了,闲言少叙,我们开始切入正题——java

Spring框架核心介绍

  DI(Dependency Injection),依赖注入,和咱们常据说的另外一个概念 IOC(控制反转)其实归根结底实现的功能是相同的,只是一样的功能站在不一样的角度来阐述罢了。这里博主就不去过多的辨析,度娘上有一大堆解释。咱们须要知道的是,什么叫依赖注入,为何要依赖注入。搞清这两点,我想对Spring的学习在思想上就算是上道了。编程

  在没用使用Spring的时候——也就是没有依赖注入的时候,java应用程序的类与类之间要实现相互的功能协做是比较费劲的,某个类(A)要实现它的功能若是须要依赖另外一个类(B)的协做的话,就须要在A类中主动建立出B类的对象,才能使用B类的方法完成功能(这里看官就不要去纠结静态方法之类的状况了)。这等因而A类须要负责B类对象整个生命周期的管理。在极度简单的状况下,在一个类中new出另外一个类的对象彷佛并无什么问题,可是复杂的应用程序类与类的协做关系每每是多边的,咱们并不知道一个类功能的实现会依赖多少个另类对象来协做,因此在类中自行建立对象而且管理对象的整个生命周期,会形成代码的高度耦合以及不可想象的复杂度。那么,试想,若是咱们能将对象的生命周期交给第三方组件来管理,当某个类须要另外的对象时第三方组件就直接建立出来交给它,这样,类就能够只专一于本身功能的实现,而不用去管理其余类对象的生命周期,这样类的功能就单纯了不少。是的,你必定已经明白了,Spring(容器)就是这个第三方组件。咱们只须要告诉Spring(容器)有哪些对象须要管理就好了,不用去关心Spring框架是如何建立对象的。这样,当某个类A须要类B对象时,若是类B已经声明交给了Sping容器管理,那么在程序运行到类A须要类B时,Spring容器就经过依赖注入的方式,将类B对象注入到类A中协助完成业务功能。经过第三方组件的依赖注入,对象无需再自行的建立和管理类与类之间的依赖关系了。对象的建立依赖注入的方式也有多种,譬如接口注入,构造方法注入,setter方法注入等等。说到这里,你对依赖注入应该有比较直白的认知了。至于为何要依赖注入,上文已经说得很明白了,就是为了减小代码中组件之间的耦合度,咱们仍是先经过简单示例来直观感觉下依赖注入比本身管理对象的好处吧——安全

 

public class Man implements Human {
    private QQCar car;
    public Man() {
        this.car = new QQCar();
    }
    @Override
    public void xiabibi() {
    }
    public void driveCar(){
        car.drive();
    }
}

 

    接口Car暂有两个实现:奔驰车和QQ车,在以上Man类和QQCar类高度耦合的代码中,老司机经过构造器只建立了QQ车对象,因此只能开QQ车,那么老司机想开奔驰怎么办呢,你让他从新建立奔驰车的对象吗?这样高度耦合的代码彷佛是毫无办法的,那么,咱们经过注入对象的方式对上述代码作一番改进:框架

 

public class Man implements Human {
    private Car car;
    public Man(Car car) {
        this.car = car;
    }
    @Override
    public void xiabibi() {
    }

    public void driveCar() {
        car.drive();
    }
}

 

 以上代码根据多态特性,经过构造器接口注入的方式屏蔽掉了具体的对象实现,这样,老司机就能想开什么车就开什么车了。这就是依赖注入带来的好处。
ide

  AOP(Aspect Oriented Programming),面向切面编程平常开发中,咱们在完成某个业务功能的时候,写了一堆代码,到最后代码优化的时候发现,真正完成业务的代码可能就那么两句,而其他都是与该部分业务相关度不大,仅仅是为了实现某种技术的代码,是彻底能够抽离出去的,因而很天然的,咱们会将其抽取成一个工具类,这样凡是用到的地方只需调用一下工具方法就ok了。咱们再站高一点看,各个业务模块的功能组件中除了完成相关的业务功能外,都有涉及日志、事务、安全控制等额外的操做等。这些并非模块的核心功能,却又不可或缺。若是将这些额外功能添加进代码,业务系统每一个组件都来一套又显得太太重复,并且让业务代码显得混乱,不够纯粹。这个时候,你问上帝,可不可让你的业务代码只专一于业务的实现,不去管什么日志、事务等不相干的东西?喔,上帝说没问题,因而就有了AOP。若是说依赖注入的目的是让相互协做的组件保持一种较为松散的耦合状态的话,AOP则是将遍及应用各处的功能分离出来造成可重用的组件。通俗点说,日志、事务等都是能够重用的组件,咱们彻底能够将分散于业务代码各处的日志、事务、安全等功能代码抽离出成为一个单独的工具组件,在Spring的配置中将其进行声明为一个功能切面,再告诉Spring你想在哪些地方、什么时机使用(切入)这些可重用组件就好了。这就是我对面向切面的简单释义。该篇只是引子,因此博主就只是简单阐述一下概念,不作具体的代码、配置实现,在会在后续的博文中将陆续奉上,欢迎拍砖。
工具

 

  2017年最后一天了,想一想这一年,除了年龄以外,技术、能力都成长的太慢太慢,博文更新太懒惰,好久憋不出点东西了,不善总结、学习,这对技术人员来讲是致命的缺点。新的一年,当以此为戒,严格律己,每周至少应有一篇博文总结,以此为誓!学习

相关文章
相关标签/搜索