Spring IOC之容器概述
1.SpringIOC容器和beans介绍
IOC的依赖注入是这样的,对象定义他们的依赖也就是他们需要在一起起作用的对象是通过构造器参数以及工厂方法的参数或者是当他们被构建或者是从工厂中返回时设置在对象实例中的属性。但它创建bean的时候容器就会注入这些依赖。这个过程实现了反转,命名为控制反转(Ioc)的原因是它通过直接的构造类或者例如服务定位模式的机制来控制实例化或者依赖的位置。
org.springframework.beans和org.springframework.context包是Spring框架IOC容器 基础。 BeanFactory接口提供了一个高级配置机制来管理任何类型的对象。 ApplicationContext是BeanFactory的子接口。它加入了更简单的功能整和:Spring AOP功能,消息资源处理(用于国际化),事件发布,可以在web应用中的使用的应用层上下文比如WebApplicationContext。
简而言之,BeanFactory提供注册和基础功能,而且ApplicationContext 增加了更多的企业级功能。ApplicationContext是BeanFactory的超集。
2.ApplicationContext
org.springframework.context.ApplicationContext接口表示IOC容器,它用于实例化配置组装前面提到的beans.容器通过读取配置元数据信息来得到它关于对象实例化配置以及组装的指令信息。配置的元数据信息可以是XML文件、Java注解、或者是Java代码。它允许你去表示构成你的程序的对象以及这些对象之间的依赖性。
ApplicationContext接口的几个实现可以在Spring中直接使用。在单独的引用中它通常去创建一个ClassPathXmlApplicationContext或者是FileSystemXmlApplicationContext实例。尽快可以通过XML格式来定义配置元数据信息,你也可以通过为另外的元数据格式提供支持的一小段的XML配置来使用Java注解或者代码去给告知容器信息。
在绝大部分场景中,显示的用户代码中不需要再一个Spring IOC容器来实例化一个或者是多个实例。例如,在一个Web应用场景中,一个简单的大约八行的样板文件web.xml就可以满足需要。如果你使用基于Eclipse的SpringSource Tool Suite的开发环境,这个样板配置文件很容易通过几个鼠标或者键盘的敲击来完成。
下面的通过一个高阶视图展示了Spring是如何工作的。你的程序类是通过配置数据联合在一块的以便ApplicationContext被创建和初始化后,你就会有一个充分的可配置运行的系统或者是应用程序。

3.配置数据
正如上面图形展示的那样,Spring IOC容器需要一种形式的配置数据,这个配置数据表示你作为一个应用开发者去告诉Spring IOC容器去实例化、配置和组装在你程序中的对象。
配置元数据习惯上使用XML格式来配置。基于XML格式的配置并不仅仅是唯一的配置方式。开发者也会选择使用java注解的配置方式。
- Annotation-based configuration:在Spring2.5中引入了注解配置方式。
- Java-based configuration:从Spring3.0开始,很多通过 Spring JavaConfig项目提供的功能成为了spring框架核心的一部分。所以你可以在定义bean通过使用Java而不仅是XML文件。为了使用这些新的功能。可以留意下@Configuration, @Bean, @Import and @DependsOn 注解。
Spring配置中一般至少会有一个通常会有多个由容器来管理的bean的定义。基于XML配置的元数据中可以看到定义在标签的子标签中。 Java配置的方式习惯是在标注了@Congiguration类的内部的 @Bean 注解方法上。
这些配置在你的实际项目中可以选择。一般来说你定义Service层对象、DAOs对象、像Struts Action的表示层对象、比如Hibernate SessionFactories的持久层对象、JMS队列等等。一般来说我们不在容易中配置模型对象,以为它一般是由DAO和业务逻辑来创建和加载的。但是,你可以使用 AspectJ 来配置这些对象,这个是springIOC容器的外面的。
下面就是基于XML配置的基本的结构:
<?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.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
id属性你用来标识单独的bean定义的字符串。class属性定义了bean的类型,使用了完整的类名。id属性的值用来指明对应的对象。
4.实例化一个容器
实例化一个Spring IOC容器是简单的。传递给ApplicationContext 构造器的路径是资源字符串,它允许容器去加载包括文件系统或者是CLASSPATH路径的不同来源的配置数据。
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] { "services.xml", "daos.xml"});
下面是Service层对象的配置信息(services.xml):
<?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.xsd">
<!-- services -->
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans
下面是数据访问层的的对象s daos.xml文件:
<?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.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for data access objects go here -->
</beans>
在前面的例子中,Service层由PetStoreServiceImpl还有两个DAO层的JpaAccountDao 、 JpaItemDao组成。 property name指明了JavaBean的属性,ref元素执行了其他的bean定义的名字。通过id 和ref的联系表明了两个关联对象的依赖。
5.基于XML的配置信息
在多个XML文件中定义bean是很有用的。而每个单独的配置文件表示你的架构中一个逻辑层或者模块。你可以使用应用程序上下文构造器从这些文件片段中加载bean的定义。这个构造器可以还有多个Resource位置参数。我们可以使用一个或者多个 标签从其他文件中引入bean的定义。例如:
beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
在上面的例子中,外部的bean定义是通过三个文件来加载的:services.xml,
messageSource.xml,和themeSource.xml.。在被引入的时候这些位置路径都是相对于
定义文件的。所以services.xml必须要在相同的目录或者是classpath位置中在引入的时候。
而messageSource.xml and themeSource.xm必须要在resources文件夹下面。
6.使用容器
ApplicationContext是用来管理注册的不同bean以及他们依赖的高级工程接口。使用方法T getBean(String name, Class
requiredType) 你可以捡出自己bean的实例。 ApplicationContex是你读取bean的定义并且向下面这样访问他们。
// create and configure beans
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] { "services.xml", "daos.xml"});
// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService. class);
// use configured instance
List<String> userList = service.getUsernameList();
你可以使用getBean()来获取你的bean实例。ApplicationContext接口有几个检出bean的方法,但是不信的是你的应用程序代码应该永远都不要使用他们。实际上,你的应用程序中不应该调用getBean()方法,一点也不要依赖Spring API。例如,Spring整合了web框架提供了针对不同的web框架类像控制器JSF管理bean的 依赖注入。
Spring IOC之容器概述的更多相关文章
- Spring IOC之Bean 概述
1.Bean概述 一个Spring IOC容器管理一个或者多个bean.这些bean是根据你提供给容器的配置数据信息创建的,例如XML形式的的定义. 在容器内部,这些bean的定义表示为BeanDef ...
- Spring IOC 低级容器解析
1.IOC是什么 IOC-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...
- Spring IOC之容器扩展点
一般来说,一个应用开发者不需要继承ApplicationContext实现类.取而代之的是,Spring IoC容器可以通过插入特殊的整合接口的实现来进行扩展.下面的几点将要讲述这些整合的接口. 1. ...
- [转]Spring IOC父子容器简介
通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的 ...
- Spring IOC 和 AOP概述
IoC(控制反转,(Inversion of Control):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IoC容器,Spring的IoC容器主要使用DI方 ...
- Spring IOC 一——容器装配Bean的简单使用
下文:SpringIOC 二-- 容器 和 Bean的深入理解 写在前面 这篇文章去年写的,缘起于去年某段时间被领导临时"抓壮丁"般的叫过去做java开发,然后在网上找了一个 Sp ...
- Spring基础03——Spring IOC和DI概述
1.什么是IOC与DI IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组件想容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了IOC之后 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)
一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...
- Spring4学习笔记1-HelloWorld与IOC和DI概述
1.安装环境 1.1安装eclipse,jdk 1.1安装Spring tool suite(非必要项) 2.spring HelloWorld 2.1 需要的jar包(spring官网下载:http ...
随机推荐
- 鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)
本文总结了Linux操作系统来管理我们的硬盘和文件系统需要使用命令.当我们在系统中增加一个硬盘驱动器.什么是我们需要去通过这个硬盘就可以真正使用步骤?下面步骤: (1)对磁盘进行分区,新建能够使用的分 ...
- netback于kthread遇到cpu affinity问题
最近的升级netback, 在测试过程中,查找vm全双工压力,rx的pps波动很厉害,见rx kthread尽管cpu affinity它是0-7 (dom0 8vcpu), 但往往,她去了物理破坏c ...
- 项目构建之maven篇:3.m2eclipse使用
m2eclipse的安装 略 设置maven文件夹 设置用户个性化的maven配置 导入mavenproject 源码下载 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- 【Java编码准则】の #02不要在client存储未加密的敏感信息
当构建CS模式的应用程序时,在client側存储敏感信息(比如用户私要信息)可能导致非授权的信息泄漏. 对于Web应用程序来说,最常见的泄漏问题是在client使用cookies存放server端获取 ...
- directX--大约CSource和CSourceStream (谁在叫fillbuffer)
CSourceStream类别,它是CSource类别OutputPin[source.h/source.cpp] 派生自CAMThread和CBaseOutputPinl 成员变量: ...
- java+js实现完整的图片展示本地目录demo
java+js实现完整的图片展示本地目录demo 最近的项目满足需要,实现通过一个前端button点击事件,流行音乐浏览下的全部图片: 思路: - 获取到所需展示图片的本地目录内全部图片的文件绝对路径 ...
- Eclipse 4.4.2 取消空格键代码上屏
基本是照这个站点来的: 点击打开链接 可是问题不止这些!! 从网上下了SDK, 然后打开之后首先发现没有plugins窗体, 好吧, 先通过Help -> Install New Softwar ...
- JavaScript之对象序列化详解
一.什么是对象序列化? 对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!): 序列化(Serialization)是将对象的状态信息转换为可以存储或传输 ...
- oracle 11g 自己主动调整
--:自己主动调教计划 begin dbms_workload_repository.create_snapshot(); end; select /*+ result_cache */ coun ...
- 转让lua性能executeGlobalFunction
没有其他的,搞搞cocos2dx的lua文字,话lua这件事情在几年前学过一段时间.还曾对自己c++介面,我已经做了一些小东西.只是时间的流逝,模糊记忆. 拿起点功夫和成本.下面是我的一些经验. co ...