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 ...
随机推荐
- Canvas的quadraticCurveTo 和 bezierCurveTo 画曲线 方法细说
详细代码如下: <!doctype html> <html lang="en"> <head> <script src="htt ...
- Java 新特性(7) - Java EE 7 新特性
http://www.ibm.com/developerworks/cn/java/j-lo-javaee7/ 新特性主要集中在: 1. 提高开发人员的生产力 2. 加强对 HTML5 动态可伸缩应用 ...
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...
- VB.NET之错误异常处理
相对于VB而言,VB.NET中引入了很多特色.当中最吸引我的就是引入了结构化异常处理. 尽管VB.NET仍然支持OnError Goto类型的异常处理,可是这样做并非非常好.相比而言,结构化异常处理更 ...
- SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
大家都知道SAP HANA项目打包成Delivery Unit(缩写为DU).依照"官方"的开发模式,特别是整个团队仅仅使用一个HANA Instance进行项目开发,因为HANA ...
- Java虚拟机参数设置(转)
今天在加载一幅图片时,eclipse报出如下错误: “Exception in thread "main" java.lang.OutOfMemoryError: Java hea ...
- apk当安装程序将文件复制到手机自带的指定文件夹
项目已获得,今天.apk文件以获得另一个非调试手机,发现一个问题. 由于涂料.所以绘图数据的点存储在一个.txt文字档.把它用usb传到指定目录下的,可是明显不科学,由于用户下载了你的.apk文件,你 ...
- MySQL 架构
原文:MySQL 架构 MySQL架构和结构分析 官方架构图: MySQL DB 各模块架构图如下: MySQL安装方式 MySQL初始化 简介:什么是事务: 事务: ACID : 事务确保了银行不 ...
- 配置静态监听解决ORA-12514错误的案例(转)
今天做Linux下DG配置的时候,遇到一个现象,tnsname.ora文件配置都正常,tnsping也正常,监听也正常,但是仍然报ORA-12514错误: SQL> set lin 130 ...
- hdu Jungle Roads(最小生成树)
Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of for ...