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之容器概述的更多相关文章

  1. Spring IOC之Bean 概述

    1.Bean概述 一个Spring IOC容器管理一个或者多个bean.这些bean是根据你提供给容器的配置数据信息创建的,例如XML形式的的定义. 在容器内部,这些bean的定义表示为BeanDef ...

  2. Spring IOC 低级容器解析

    1.IOC是什么 IOC-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...

  3. Spring IOC之容器扩展点

    一般来说,一个应用开发者不需要继承ApplicationContext实现类.取而代之的是,Spring IoC容器可以通过插入特殊的整合接口的实现来进行扩展.下面的几点将要讲述这些整合的接口. 1. ...

  4. [转]Spring IOC父子容器简介

    通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的 ...

  5. Spring IOC 和 AOP概述

    IoC(控制反转,(Inversion of Control):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IoC容器,Spring的IoC容器主要使用DI方 ...

  6. Spring IOC 一——容器装配Bean的简单使用

    下文:SpringIOC 二-- 容器 和 Bean的深入理解 写在前面 这篇文章去年写的,缘起于去年某段时间被领导临时"抓壮丁"般的叫过去做java开发,然后在网上找了一个 Sp ...

  7. Spring基础03——Spring IOC和DI概述

    1.什么是IOC与DI IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组件想容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了IOC之后 ...

  8. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  9. Spring4学习笔记1-HelloWorld与IOC和DI概述

    1.安装环境 1.1安装eclipse,jdk 1.1安装Spring tool suite(非必要项) 2.spring HelloWorld 2.1 需要的jar包(spring官网下载:http ...

随机推荐

  1. ocp认证考试指南第一章

    数据库存储结构: 物理数据库存储结构: 必须的三类文件: 控制文件(controlFile):multiplexing the controfile 多路复用控制文件,指向其它关键文件,存储序列号和时 ...

  2. JAVA该队列中的数组,圆阵队列,链队列

    /** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...

  3. Advanced Installer 制作.NetWeb部署安装包

    原文:Advanced Installer 制作.NetWeb部署安装包 因为是.Net的Web应用程序,所以想用Advanced Installer 调用Dll实现安装部署. 因为我需要自己定制参数 ...

  4. 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期

    假设BeanFactory为了产生.管理Bean, 一个Bean从成立到毁灭.它会经过几个阶段运行. 据我所知,一般bean包括在生命周期:设定,初始化,使用阶段,四个核心阶段销毁. 1.@Bean的 ...

  5. 使用 CodeIgniter 创建一个简单的 Web 站点

    原文:使用 CodeIgniter 创建一个简单的 Web 站点 参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index ...

  6. Gitserver几家互联网代理安装方法未能解决。

    1.gem安装下面的错误 root@ubuntu:/home/git/gitlab# sudo gem install bundler --no-ri --no-rdoc ERROR:  Could ...

  7. java编程接口(1) ------ Swing基金会

    本文提出了自己的学习笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 近期想学下java的界面编程,在此记录下.    大多数的Swing应用都被构 ...

  8. NYoj 最舒适的路线

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=711 分析:枚举速度最大的边,找出能够从S到达T的最大速度,然后求出它们的比值,与已 ...

  9. AlloyRenderingEngine

    AlloyRenderingEngine燃烧的进度条 写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine HTML 5新增了progre ...

  10. Jenkins + robot framework + git持续集成

    安装略过... 一.Jenkins安装插件 进入系统管理—插件管理—可选插件下安装以下插件Git Client Plugin.GIT plugin.GitHub API Plugin.GitHub p ...