儿童红外线测温仪:SPring 创建实例原理

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 19:43:05
 大家都知道Spring是一种控制翻转(IoC-Inversion of Control)和面向切面(AOP)的容器框架(这里先不讨论AOP,只提下IoC);所谓控制反转Ioc即应用本身不再负责创建和维护依赖对象(即应用所要调用的对象),而是将这些工作交给外部的Ioc容器(这里就是Spring),这样就实现了控制权的转移,即控制反转。这样做要达到的目的是实现各层间的解耦,以便于项目的开发和维护。
      这样说了,可能很多人还是一头雾水,这里给大家举个例子,在做Spring与Hibernate或Ibatis这类持久层框架的结合项目时,Service层需要调用DAO层,但Service层不需要负责创建DAO的实例,而是Spring创建DAO的实例,再把DAO实例注入到Service中使用。这里的Service就是应用,而DAO就是Service所依赖的对象。这样就可以是想Service与DAO间的解耦,从而便于开发和维护。形象点可以这样理解:公司A生产笔记本电脑,但他不一定必须掌握生产显示屏的技术和工艺,他可以和公司B合作,让公司B为其提供所需的显示屏。至于显示屏如何生产,出现质量问题怎么办等等这些问题都不需要A关心,A只要在需要的时候从公司B买回显示屏装到自己的电脑上就ok了,各司其职,类似于分工的原理。
      到这里是不是会产生一个疑问,Spring到底是怎么创建和维护实例的呢?解决这个问题就要提到Spring的核心配置文件(这里暂且叫做beans.xml),在beans.xml中的bean节点下配置着需要管理的类的信息,Spring用dom4j读取beans.xml中bean节点的信息(id、class等),然后根据读取到的信息,通过反射机制创建相应类(类名为class的值)的实例(实例名为id的值)。
     现在实例有了,可该如何注入到应用(即需要调用实例的类)中呢?主要还是读取beans.xml中的信息,这一次读的是bean节点的子节点property的信息(name,ref等)。根据读取的信息将名为ref的值的实例通过获取应用中名为name的值的属性的setter方法,并用该方法将实例注入进去。所以在应用类中必须要有相应的属性,该属性的类型即为被注入的类,属性名必须与property节点的name的值保持一致,并且要为其提供相应的setter方法,否则Spring将导入失败,应用类调用时将抛出空指针异常(NullPointerException),所以当遇到这个异常时就要注意下上面提到的几个方面。
 到目前为止只说了自定义类型的注入,如果要注入常用类型(如Integer,String,boolean等)或者集合类型(如List,Set,Map等)该怎么办呢?其实原理跟上面都是一样的,只不过有些细节需要处理下。
 现在实例有了,也可以成功注入了,就可以放心调用了。