Spring反向控制(Ioc)--1
反向控制就是依赖注入。
任何重要的系统,都需要至少两个相互合作的类,来共同完成业务逻辑。通常,每个对象都要自己负责得到与它合作的对象(依赖)。这样就导致了代码的耦合度提高,而且还难以测试。
使用Ioc后,对象的依赖,都是在创建对象的时候,由负责协调系统中各个对象的外部实体进行管理提供的,也就是将依赖注入到对象中。这个负责协调的外部实体,也就是Spring容器。
反向控制(Ioc)是Spring框架的核心,虽然说起来有点复杂,但在项目使用中,Ioc是很简单的,通过使用Ioc,将会使我们的代码变得更加简单,容易理解还容易测试。
BeanFactory
BeanFactory是Spring容器中的一个管理类。
负责创建和分发其它Bean的类。
负责注入每个类的依赖关系。
负责调用实现了初始化和销毁方法的Bean的初始化和销毁方法。
被管理Bean,是在需要使用的时候,才进行创建管理起来的。
最常用到了BeanFactory类是org.springframework.bean.factory.xml.XmlBeanFactory。
通过该类获取被管理Bean的方式如下:
BeanFactory factory = new XmlBeanFactory(new FileInputStream(“beans.xml”));
MyBean myBean = (MyBean)factory.getBean(“myBean”);
这样就可以在代码中调用myBean实例的相关方法了。
ApplicationContext
ApplicationContext实现了BeanFactory所实现的所有功能,而且还在BeanFactory的基础上,还实现了:
1. 提供了对文本信息进行解析的工具,包括对多国语言的支持
2. 提供了载入文件资源的通用方法,比如载入图片
3. 提供了向注册监听器发送事件的途径
4. ApplicationContext是在载入文本信息后,立马就载入所有的Bean信息,而不同BeanFactory一样,在getBean的时候才载入对应的Bean的信息
鉴于ApplicationContext功能的强大,一般的系统都会优先选择ApplicationContext。只有在考虑资源的稀缺情况下,才使用BeanFactory,比如移动设备上的应用开放。
下面是经常用到的ApplicationContext的实现,以及它们的使用方法:
1. ClassPathXmlApplicationContext
从类路径中的xml文件,载入上下文定义信息。把上下文定义文件当成类路径资源。该方式会在class path的所有目录下寻找指定的xml文件,直到找到为止
使用方式:
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
MyBean myBean = context.getBean(“myBean”);
2. FileSystemXmlApplicationContext
从文件系统中的xml文件载入上下文定义信息。该方式只会在指定的位置找xml文件。
使用方式:
ApplicationContext context = new FileSystemXmlApplicationContext(“c:/beans.xml”);
MyBean myBean = context.getBean(“myBean”);
3. XmlWebApplicationContext
从web系统中的xml文件载入上下文定义信息
载入WEB-INF/applicationContext.xml文件
使用方法:
ApplicationContext context = new XmlWebApplicationContext();
MyBean myBean = context.getBean(“myBean 2” );
使用XML装配Bean
理论上Bean的装配可以是任何资源文件,但实际上,xml是最常见的Spring应用系统配置资源,我们这里就介绍它的配置方式。
Spring中所有的xml资源文件,都是标准的xml文件,必须以<beans>为根标签,然后包含很多<bean>子标签,定义一个个的Bean。具体格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean... />
...
</beans>
接下来一个个讲解不同情形的Bean的定义。
1. 定义一个简单的bean
<bean id=”myBean” class=”cn.com.book.demo.MyBean”/>
2. 定义一个原型或单实例bean
原型Bean:每次从上下文中获取的时候,都是不同的实例
<bean id=”myBean” class=”cn.com.book.demo.MyBean” singleton=”false”/>
单实例Bean:每次从上下文中获取的,都是同一个实例
<bean id=”myBean” class=”cn.com.book.demo.MyBean” singleton=”true”/>
3. 初始化和销毁
<bean id=”myBean” class=”cn.com.book.demo.MyBean” init-method=”init” destroy-method=”destory”/>
实例创建后,自动调用init方法,对对象进行初始化,要销毁前,自动调用destory方法,实现资源的释放