Spring 框架的解析

今天从网吧打dota回来本来是没什么心情学习的..但是看完了火影又不知道该干什么.虽然最近的项目不需要使用spring框架.但是我还是想看看spring框架的神奇之处在哪里,为什么有的人觉得它很好用.但是又有一些人觉得没有存在的必要呢?还有就是当别人问到我为什么要用spring框架的时候我总感觉自己并不是很懂它..但就是想用..我记得有一次项目组成员问我你为什么享用spring'框架的时候我的回答是:spring 框架使用依赖注入的功能能够很好的实现对象之间的松耦合..但是事实上,我在刚开始接触spring的时候就想知道到底依赖注入DI(或者叫控制反转IOC)到底是什么含义.虽然我并不想在语文的字面意思上了解他们到底是什么意思.但至少我应该从代码的角度来理解这两个概念的含义,所以我就查询了好多关于spring的书籍..但是他们上面讲的很多都是使用set注入..其实就是set方法然后里面有个参数是关于要注入的对象的.当时我就想不明白这种依赖注入有什么意义?该不明白的还是不明白..今天看了马老师的视频之后感觉有一种恍然大悟的感觉..但是又怕自己忘记了自己对spring的理解..就先记下来希望对其他一些人有用,如果有什么说的不对的地方,欢迎指导批评

    首先,看完马老师的教程,再有别人问我为什么使用spring框架的时候,我可能会很自信的说:首先spring框架通过依赖注入的方式实现了对象(       组件     )与对象(组件)之间的松耦合关系.并且spring支持面向接口编程.这样可以很好的支持多态,其次首先解释下什么是耦合关系:耦合关系是指两个对象之间存在的依赖关系,比如B依赖于A,那么A和B之间就存在耦合关系..如果直接在B中实例化A的对象,那么他们的耦合关系就算是紧耦合了..如果不懂什么意思看下面代码

public class B
{
     private A a=new A();
     public A getA(){
           return a;
     }
} 
由程序可以看到.类B中直接初始化了A的实例,这样B的对象与A的对象在B初始化的时候就紧紧的联系到了一起.注意这里是直接初始化了A的对象..而只定义了get方法..而没有使用set方法..这种结果就是耦合度很高..比如如果有一天B不再依赖与A了..那么B中的代码要改变,或许调用B对象的其他很多方法都得改变..或者使用set注入的方式,那么在调用B的对象的时候同样要new 出来一个A的对象,然后再使用set方法让两个对象关联..在java web开发中,一般都是new 关键字来实现对象或组件之间的关联关系的.一旦依赖关系发生改变.可能会修改大量的代码(这个我自己是没有什么切身体会.因为我一般都使用的spring这种方式),但是试想一下,如果你的每一个业务逻辑中要操作的数据库部分,每次写方法的时候都要建立链接--->编写sql语句----->执行语句------>提交更新.这样就把数据库操作和业务逻辑合并在了一起.这样的组件之间的耦合度由此可见...

而通过DI(IOC),首先可以这么理解DI(依赖注入)就是一个对象依赖一个系统的容器来注入到另一个对象里面去,实现就看各个公司了..另外更加官方一点的解释是对象或组件之间的依赖关系由外部容器控制..由容器在系统运行期间确定两个对象或者组件之间的关联关系,根据需要将某个对象动态的注入到某个组件或者运行类中即:Don't Call us,We'll Call you

现在知道了spring完成的功能,后面就是学习spring的原理了..其实spring使用的原理也很简单..首先建立配置文件:spring中的配置文件为xml格式的..首先spring容器通过sax或者dom来解析xml格式的文件..然后创建一个bean的工厂类..这个配置文件中包含了所有已经注册的组件以及组件与组件的依赖关系..然后在工厂类中的getBean方法中通过java中的反射机制来完成注入;在这里解释一下什么叫反射机制;通常在系统运行的时候JVM会创建很多种类加载器来加载在程序中使用的类,当然一般都是有system的类加载器来加载程序中包含的类文件包括类库,类加载完成后会放在一个叫方法区的内存区域..这个区域主要是存放类的一些相关信息比如字段,方法,方法参数等等.以及类变量,还有一些常量池,比如字符串常量池和包装类常量池等等..通过使用该类命得到该类的加载器,然后通过该类的加载器来找到该类的一些属性跟方法..进而通过该类的set方法来完成注入功能..


所以spring说白了就是很多组件的容器负责管理类信息.以及完成注入信息,比如在spring配置文件中注册了很多bean,包括数据库访问的dao类,业务逻辑处理的services类.以及进行控制和转发的action类..下面演示一下整个系统的流程:

首先用户进行输入---->然后提交请求----->由spring容器来查看请求的目的地,并且完成对action的初始化..然后当调用services层中的某一个类时,spring容器初始化services组件并且完成services组件和action组件的依赖关系.而一般services都需要调用dao层的接口来完成对数据库的操作.所以spring层又要完成dao的初始化并且完成services组件与dao层组件的依赖关系..如果采用了hibernate的话,spring中同样可以注册该数据库的信息.然后当dao层要操作数据库的时候还要调用hibernate的sessionFactory对象信息..spring同样要负责完成sessionFactory 的初始化并且完成依赖关系.最后完成数据库操作.然后通过action的配置文件.进行重定向或者请求转发..这样就完成了一个请求的全部流程,就写到这边了..时间也不早了..如果有什么写的不对的地方欢迎留言指导

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值