Spring3核心技术之IOC控制反转
程序员文章站
2022-05-25 10:30:32
...
[size=medium]个人觉得Spring用起来其实简单,但是如果想真正弄懂原理和思想,还是要花一些功夫和时间的,最近一直在跟论坛的Spring大神jinnianshilongnian的帖子,受益匪浅,我也通过博客把自己的学习过程记录下来。对于IOC理解也可以看看这个:
[url]http://zhidao.baidu.com/question/182355887.html[/url]
[b]IoC是什么[/b]
[color=red]Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想[/color]。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”。
简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写控制实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
[b]谁控制谁,控制什么:[/b]
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
[color=red]IoC很好的体现了面向对象设计法则,即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。[/color]
下面动手做个Spring的演示程序:
首先加入Spring的JAR包,这是基本的JAR包:
[img]http://dl.iteye.com/upload/attachment/0072/9831/c4a0c9ee-75b8-336e-82de-ad07a1af561e.jpg[/img]
然后是开发需要Spring来管理的Bean:
[/size]
[size=medium]接口和实现都开发好了,那如何使用Spring IoC容器来管理它们呢?这就需要配置文件,让IoC容器知道要管理哪些对象。下面是配置文件applicationContext.xml的配置:[/size]
[size=medium]那如何获取IoC容器并完成我们需要的功能呢?首先应该实例化一个IoC容器,然后从容器中获取需要的对象,然后调用接口完成我们需要的功能,代码示例如下:[/size]
[size=medium]
自此一个简单的Spring已完成,让我们深入理解下容器和Bean吧:
[b]详解IoC容器[/b]
[color=darkred]在Spring Ioc容器的代表就是org.spring.beans包中BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.spring.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现(如针对web应用的WebApplicationContext)。简单说,BeanFactory提供了IoC容器最基本功能,而ApplicationContext则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext[/color]
[color=red][b]ApplicationContext接口获取Bean方法简介:[/b][/color]
[list][*]Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换;
[*]T getBean(String name, Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;
[*]T getBean(Class<T> requiredType) 根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个Bean存在容器将抛出异常;
[*]Map<String, T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的Map,如果没有Bean对象存在则返回空的Map[/list]
[align=center][b]总结[/b][/align]
[color=brown][b]非入侵:[/b][/color]除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵。
[color=brown][b]低耦合:[/b][/color]客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改,是不是低耦合。
[color=brown][b]灵活性:[/b][/color]Bean之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活
[/size]
[url]http://zhidao.baidu.com/question/182355887.html[/url]
[b]IoC是什么[/b]
[color=red]Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想[/color]。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”。
简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写控制实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
[b]谁控制谁,控制什么:[/b]
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
[color=red]IoC很好的体现了面向对象设计法则,即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。[/color]
下面动手做个Spring的演示程序:
首先加入Spring的JAR包,这是基本的JAR包:
[img]http://dl.iteye.com/upload/attachment/0072/9831/c4a0c9ee-75b8-336e-82de-ad07a1af561e.jpg[/img]
然后是开发需要Spring来管理的Bean:
[/size]
public interface MyBean {
public void domain();
}
public class MyBeanA implements MyBean{
public void domain() {
System.out.println("MyBeanA is executing...");
}
}
[size=medium]接口和实现都开发好了,那如何使用Spring IoC容器来管理它们呢?这就需要配置文件,让IoC容器知道要管理哪些对象。下面是配置文件applicationContext.xml的配置:[/size]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- id 表示你这个组件的名字,class表示组件类 -->
<bean id="bean_a" class="com.chou.spring.bean.MyBeanA"></bean>
</beans>
[size=medium]那如何获取IoC容器并完成我们需要的功能呢?首先应该实例化一个IoC容器,然后从容器中获取需要的对象,然后调用接口完成我们需要的功能,代码示例如下:[/size]
//可以读取多个配置文件
String[] configs = new String[] {"applicationContext.xml"};
//读取配置文件实例化一个IoC容器
ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);
//从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
MyBean m = cxt.getBean("bean_a",MyBean.class);
m.domain();
[size=medium]
自此一个简单的Spring已完成,让我们深入理解下容器和Bean吧:
[b]详解IoC容器[/b]
[color=darkred]在Spring Ioc容器的代表就是org.spring.beans包中BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.spring.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现(如针对web应用的WebApplicationContext)。简单说,BeanFactory提供了IoC容器最基本功能,而ApplicationContext则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext[/color]
[color=red][b]ApplicationContext接口获取Bean方法简介:[/b][/color]
[list][*]Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换;
[*]T getBean(String name, Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;
[*]T getBean(Class<T> requiredType) 根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个Bean存在容器将抛出异常;
[*]Map<String, T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的Map,如果没有Bean对象存在则返回空的Map[/list]
[align=center][b]总结[/b][/align]
[color=brown][b]非入侵:[/b][/color]除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵。
[color=brown][b]低耦合:[/b][/color]客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改,是不是低耦合。
[color=brown][b]灵活性:[/b][/color]Bean之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活
[/size]