Spring3核心技术之IOC控制反转 博客分类: Spring spring3控制反转ioc容器
程序员文章站
2024-02-07 13:19:22
...
个人觉得Spring用起来其实简单,但是如果想真正弄懂原理和思想,还是要花一些功夫和时间的,最近一直在跟论坛的Spring大神jinnianshilongnian的帖子,受益匪浅,我也通过博客把自己的学习过程记录下来。对于IOC理解也可以看看这个:
http://zhidao.baidu.com/question/182355887.html
IoC是什么
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”。
简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写控制实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
谁控制谁,控制什么:
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
IoC很好的体现了面向对象设计法则,即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
下面动手做个Spring的演示程序:
首先加入Spring的JAR包,这是基本的JAR包:
然后是开发需要Spring来管理的Bean:
接口和实现都开发好了,那如何使用Spring IoC容器来管理它们呢?这就需要配置文件,让IoC容器知道要管理哪些对象。下面是配置文件applicationContext.xml的配置:
那如何获取IoC容器并完成我们需要的功能呢?首先应该实例化一个IoC容器,然后从容器中获取需要的对象,然后调用接口完成我们需要的功能,代码示例如下:
自此一个简单的Spring已完成,让我们深入理解下容器和Bean吧:
详解IoC容器
在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
ApplicationContext接口获取Bean方法简介:
非入侵:除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵。
低耦合:客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改,是不是低耦合。
灵活性:Bean之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活
http://zhidao.baidu.com/question/182355887.html
IoC是什么
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”。
简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写控制实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
谁控制谁,控制什么:
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
IoC很好的体现了面向对象设计法则,即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
下面动手做个Spring的演示程序:
首先加入Spring的JAR包,这是基本的JAR包:
然后是开发需要Spring来管理的Bean:
public interface MyBean { public void domain(); }
public class MyBeanA implements MyBean{ public void domain() { System.out.println("MyBeanA is executing..."); } }
接口和实现都开发好了,那如何使用Spring IoC容器来管理它们呢?这就需要配置文件,让IoC容器知道要管理哪些对象。下面是配置文件applicationContext.xml的配置:
<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>
那如何获取IoC容器并完成我们需要的功能呢?首先应该实例化一个IoC容器,然后从容器中获取需要的对象,然后调用接口完成我们需要的功能,代码示例如下:
//可以读取多个配置文件 String[] configs = new String[] {"applicationContext.xml"}; //读取配置文件实例化一个IoC容器 ApplicationContext cxt = new ClassPathXmlApplicationContext(configs); //从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现” MyBean m = cxt.getBean("bean_a",MyBean.class); m.domain();
自此一个简单的Spring已完成,让我们深入理解下容器和Bean吧:
详解IoC容器
在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
ApplicationContext接口获取Bean方法简介:
- 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
总结
非入侵:除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵。
低耦合:客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改,是不是低耦合。
灵活性:Bean之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活