java

位置:IT落伍者 >> java >> 浏览文章

Spring 控制反转(IoC)容器


发布日期:2022年01月28日
 
Spring 控制反转(IoC)容器

(二)个人整理Spring系列控制反转(IoC)容器

什么是控制反转模式? 不创建对象但是描述创建它们的方式在代码中不直接与对象和服务连接但在配置文件中描述哪一个组件需要哪一项服务 容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起

Spring 中的 Bean? 由Spring IoC容器所管理的对象被称之为beanbean就是由Spring容器初始化装配及被管理的对象 bean定义以及bean相互间的依赖关系将通过配置元数据来描述什么是Spring IoC容器? orgspringframeworkbeans包是Spring IoC容器的基础 orgspringframeworkbeansfactoryBeanFactory接口是Spring IoC容器的实际代表者 IoC容器负责容纳此前所描述的bean并对bean进行管理 BeanFactory 接口 BeanFactory是IoC容器的核心接口是工厂设计模式的实现bean 工厂的概念是 Spring 作为 IOC 容器的基础 它的职责包括实例化检索配置应用程序中的对象及管理对象之间的关系 BeanFactory 支持两个对象模型 单态模型提供了具有特定名称的对象的共享实例可以在查询时对其进行检索Singleton 是默认的也是最常用的对象模型对于无状态服务对象很理想 原型模型确保每次检索都会创建单独的对象在每个用户都需要自己的对象时原型模型最适合 ApplicationContext接口 orgntextApplicationContext由BeanFactory接口派生扩展而来因而提供了BeanFactory所有的功能 在构建JEE应用时使用ApplicationContext将是更好的选择 context包还提供了以下的功能 MessageSource 提供国际化的消息访问 资源访问如URL和文件 事件传播实现了ApplicationListener接口的bean 载入多个(有继承关系)上下文

配置元数据 Spring IoC容器将读取配置元数据并通过它对应用中各个对象进行实例化配置以及组装 基于XML的元数据是最常用到的配置元数据格式然而它并不是唯一的描述格式Spring IoC容器在这一点上是完全开放的 当使用基于XML的配置元数据时将在顶层的<beans/>元素中配置一个或多个<bean/>元素 bean定义与应用程序中实际使用的对象一一对应通常情况下bean的定义包括 服务层对象数据访问层对象(DAO)类似Struts Action的表示层对象Hibernate SessionFactory对象JMS Queue对象等等

实例化IoC容器(基于XML的元数据) 通过ClassPathXmlApplicationContext类加载一个或多个XML文档来实例化BeanFactory接口的实现扩展ApplicationContext类 要从 BeanFactory 检索 bean只需调用 getBean() 方法传入将要检索的 bean 的名称即可

一个简单Spring 示例

建立Java项目MySpring

导入Spring框架

创建JavaBeanHelloBean编写testHello方法

HelloBeanjava

view plaincopy to clipboardprint?

<FONT size=> package comqubean;

public class HelloBean {

public String sayHello(String name){

return Stringformat(%$s : Hello World! name);

}

}</FONT>

package comqubean;

public class HelloBean {

public String sayHello(String name){

return Stringformat(%$s : Hello World! name);

}

} 配置applicationContextxml 将HelloBean注入Spring容器

applicationContextxml

view plaincopy to clipboardprint?

<FONT size=> <?xml version= encoding=UTF?>

<beans

xmlns=

xmlns:xsi=instance

xsi:schemaLocation= beansxsd>

<!方法

<import resource=OtherXML/helloBeanxml/>

>

<!方法>

<bean class=comqubeanHelloBean id=helloBean>

</bean>

</beans></FONT>

<?xml version= encoding=UTF?>

<beans

xmlns=

xmlns:xsi=instance

xsi:schemaLocation= beansxsd>

<!方法

<import resource=OtherXML/helloBeanxml/>

>

<!方法>

<bean class=comqubeanHelloBean id=helloBean>

</bean>

</beans>view plaincopy to clipboardprint?

<FONT size=><STRONG><U>helloBeanxml</U></STRONG></FONT>

helloBeanxmlview plaincopy to clipboardprint?

<?xml version= encoding=UTF?>

<beans

xmlns=

xmlns:xsi=instance

xsi:schemaLocation= beansxsd>

<bean class=comqubeanHelloBean id=helloBean>

</bean>

</beans>

<?xml version= encoding=UTF?>

<beans

xmlns=

xmlns:xsi=instance

xsi:schemaLocation= beansxsd>

<bean class=comqubeanHelloBean id=helloBean>

</bean>

</beans>view plaincopy to clipboardprint?

<FONT size=></FONT>

导入Junit 测试

编写测试类TestHello 重写setUp方法实例化容器编写testHello方法测试HelloBean的hello方法

view plaincopy to clipboardprint?

<FONT size=> TestHellojava</FONT>

TestHellojavaview plaincopy to clipboardprint?

<FONT size=>

package comqutest;

import orgntextApplicationContext;

import orgntextsupportClassPathXmlApplicationContext;

import comqubeanHelloBean;

import junitframeworkTestCase;

public class TestHello extends TestCase {

private ApplicationContext ctx;

private HelloBean hello;

protected void setUp() throws Exception {

supersetUp();

thisctx = new ClassPathXmlApplicationContext(

new String[] {ApplicationContextxmlOtherXML/helloBeanxml});

thishello = (HelloBean) thisctxgetBean(helloBean);

}

public void testSayHello(){

assertEquals(Java : Hello World! thishellosayHello(Java));

}

}

</FONT>

               

上一篇:Hibernate获取数据与缓存使用

下一篇:Struts2的整体流程(上)