1、Spring简介
2、Spring特色
3、Spring与IoC
原文连接:https://www.cnblogs.com/wangbin2188/p/9013765.htmlhtml
Spring 是于2003 年兴起的一个轻量级的Java 开发框架,它是为了解决企业应用开发的复杂性而建立的。Spring的核心是控制反转(IoC)和面向切面编程(AOP)。简单来讲,Spring是一个分层的Java SE/EE full-stack(一站式) 轻量级开源框架。编程
Spring框架体系结构:
Spring由20多个模块组成,它们能够分为数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP, Aspects)、应用服务器设备管理(Instrumentation)、消息发送(Messaging)、核心容器(Core Container)和测试(Test)segmentfault
一、非侵入式
所谓非侵入式是指,Spring框架的API不会在业务逻辑上出现,即业务逻辑是POJO(Plain Old Java Objects)。因为业务逻辑中没有Spring的API,因此业务逻辑能够从Spring框架快速的移植到其余框架,即与环境无关。设计模式
二、容器
Spring做为一个容器,能够管理对象的生命周期、对象与对象之间的依赖关系。能够经过配置文件,来定义对象,以及设置与其余对象的依赖关系。安全
三、IoC
控制反转(Inversion of Control),即建立被调用者的实例不是由调用者完成,而是由Spring容器完成,并注入调用者。
当应用了IoC,一个对象依赖的其它对象会经过被动的方式传递进来,而不是这个对象本身建立或者查找依赖对象。即,不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。服务器
四、AOP
面向切面编程(AOP,Aspect Orient Programming),是一种编程思想,是面向对象编程OOP的补充。不少框架都实现了对AOP编程思想的实现。Spring也提供了面向切面编程的丰富支持,容许经过分离应用的业务逻辑与系统级服务(例如日志和事务管理)进行开发。应用对象只实现它们应该作的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
咱们能够把日志、安全、事务管理等服务理解成一个“切面”,那么之前这些服务一直是直接写在业务逻辑的代码当中的,这有两点很差:首先业务逻辑不纯净;其次这些服务被不少业务逻辑反复使用,彻底能够剥离出来作到复用。那么AOP就是这些问题的解决方案,能够把这些服务剥离出来造成一个“切面”,以期复用,而后将“切面”动态的“织入”到业务逻辑中,让业务逻辑可以享受到此“切面”的服务。架构
控制反转(IOC,Inversion of Control),是一个概念,是一种思想。框架
指将传统上由程序代码直接操控的对象调用权交给容器,经过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码自己反转到了外部容器。分布式
可是,须要注意,IoC也是有局限性的,其不能使用在分布式系统中。即其所依赖的反转到的外部容器,必需要与控制权出让方同处于一个JVM中。
IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种:依赖注入和依赖查找。依赖注入方式应用更为普遍。
. 依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境给组件,程序代码则须要提供具体的查找方式。比较典型的是依赖于JNDI系统的查找。
. 依赖注入:Dependency Injection,DI,程序代码不作定位查询,这些工做由容器自行完成。
依赖注入DI是指程序运行过程当中,若须要调用另外一个对象协助时,无须在代码中建立被调用者,而是依赖于外部容器,由外部容器建立后传递给程序。
Spring的依赖注入对调用者与被调用者几乎没有任何要求,彻底支持POJO之间依赖关系的管理。
依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一块儿,而不是以硬编码的方式耦合在一块儿的。测试
Spring DI = 工厂 + 反射 + 配置文件
传统开发中的面向抽象编程,调用者与接口实现类是紧密耦合在一块儿的。若实现类发生改变,则必须修改原有代码:在调用者类中将实现类进行更换。但,这不符合软件开发的OCP原则(OCP,Open-Close Principle)。
OCP原则,即开闭原则,指软件实体(类、模块、功能等)应该能够被扩展,但不可被修改。即对功能扩展是开放的,对已有代码修改是关闭的。也就是说,应该在不修改现有代码的基础上,扩展新功能。
若要使调用者类与接口实现类之间实现解耦,可以使用工厂模式。但,这又使调用者与工厂耦合,工厂与接口实现类耦合。实现类的更换,不须要修改调用者类,但须要修改工厂,即代码仍需从新编译。
此时,能够经过在工厂类中使用“反射 + 配置文件”的方式来加载接口实现类。而这就是Spring的IoC的工做原理。
举例:common
Step1:建立一个Java Project
Step2:建立Service层接口IStudentService
Step3:建立接口实现类StudentServiceImpl
Step4:建立Dao层接口IStudentDao
Step5:建立接口实现类StudentDaoImpl
Step6:编写测试类MyTest
举例:factory
Step1:复制common项目,改名为factory
Step2:建立工厂类ServiceFactory 与DaoFactory
Step3:修改MyTest中Service的获取方式
Step4:修改StdentServiceImpl中Dao的获取方式
举例:reflect
Step1:复制factory项目,改名为reflect
Step2:修改Service工厂类:使用反射建立Service实现类对象
Step3:修改Dao工厂类:使用反射建立Dao实现类对象