spring framework 4 学习之路 2 -- Ioc容器

本文主要介绍控制反转的实现。IoC也被称为依赖注入(DI)。Ioc使得我们不需要关注如何定义对象的依赖实现,也就是说,对象所依赖的其他对象,只能通过构造器参数,工厂方法参数或者当对象被初始化后调用set方法进行设置。当容器创建bean的时候,就开始注入依赖。这个过程是反转的,因此称为控制反转,由bean自己控制它所依赖对象的初始化和位置,通过直接使用类的构造器,或者是称为Service Locator模式的原理。

org.springframework.beans和org.springframework.context包是Spring framework的Ioc容器基础部分。BeanFactory接口提供了一个配置机制,可以管理任一类型的对象。ApplicationContext是BeanFactory的子接口。它整合了Spring AOP,信息资源处理,事件发布,以及应用层上下文如WebApplicationContext以用在web应用中。

简而言之,BeanFactory提供了配置框架和基本功能,ApplicationContext增加更多企业层的功能。

在Spring中,对象构成了应用的骨架,这些对象都被Spring Ioc容器管理,称之为Beans。一个Bean是一个对象,可以被初始化,被装配,同样也被Ioc容器管理,另外,一个Bean是应用中很多对象中的一个。Beans,以及它们的依赖通过容器的配置元数据进行反射。

org.springframework.context.ApplicationContext接口代表了Spring Ioc容器,负责初始化,配置和装配前面提到的bean。这个容器通过读取配置元数据来决定什么对象初始化,配置和装配。这个配置元数据可以在XML,Java注解和Java代码中呈现。它允许你表达组成应用的对象以及这些对象之间丰富的内部依赖关系。

ApplicationContext接口的一些实现是开箱即用的。在单机应用中,一般是创建ClassPathXmlApplicationContext或者是FileSystemXmlApplicationContext。虽然XML一直是定义配置元数据的传统方式,但是你也可以告知容器去使用Java注解或者Java Code来定义配置元数据,这种方式需要提供一些XML配置来进行声明。

在大多数应用场景中,用户代码并不需要明确的初始化一个或多个Spring Ioc容器实例。比如,在Web应用场景中,通过web.xml的配置就足够了~

下图在较高层面展示了Spring是如何工作的。你的应用类结合配置元数据,因此,当ApplicationContext被创建和初始化之后,你就拥有了一个完全配置的,可执行的系统或者应用。


1. 配置元数据

正如上图所展示的,Spring Ioc容器消费配置元数据,这些配置元数据代表了你作为一个应用开发者,告诉Spring容器如何去初始化,配置,装配应用中的对象。

配置元数据一般通过XML格式来提供,这也是本章节用来表达关键概念和Spring Ioc容器特点的主要方式。

Spring配置包含了至少一个,一般情况多于一个Bean定义。而这个Bean是必须由容器管理的。基于XML的配置元数据表达这些bean通过标签<bean>元素,<bean>包含于高级别的标签<beans>。Java配置一般在@Configuration类中使用@bean注解方法。

这些bean定义与实际的对象相关联,这些对象构成了你的应用。你可以定义服务层对象,数据获取对象(DAOs),表现层对象如Struts Action实例,架构类对象如Hibernate SessionFactories, JMS队列等等。你不需要在容器中定义细粒度的领域对象,因为这一般是DAOs和业务逻辑的职责,去创建和加载领域对象。但是,你可以使用Spring的AspectJ整合来配置由Ioc以外的容器所创建的对象。

如下是基于XML的配置元数据的基础结构:


 id属性是一个字符串,用来唯一的标识一个bean定义。class属性定义了这个bean的类型,并且使用完全限定类名。id属性的值指向协作对象。

2. 容器初始化

初始化Spring Ioc容器是十分直接的。提供给ApplicationContext构造器的路径位置或者路径实际上是资源字符串,该资源字符串使得容器从各种外部资源,比如本地文件系统,Java CLASSPATH等加载配置元数据。


  以下列子展示了服务层对象(service.xml)配置元数据:


  以下例子展示了数据获取对象(daos.xml)文件:


  在上述例子中,服务层包含了类PetStoreServiceImpl,以及两个数据获取对象类型JpaAccountDao,JpaItemDap。property name元素指向的是JavaBean属性名称,ref元素指向的是另一个bean定义名称。id和ref元素之间的连接表达了协作对象之间的依赖。

 一般在多个XML文件中定义bean是十分有效的。每一个独立的XML配置文件代表了架构里一个逻辑层或者一个模块。你可以通过applicaionContext构造器从这些XML文件中加载bean定义。这些构造器允许输入多个Resource位置,正如前面例子中所示一样。另外,也可以使用一个或多个<import/>标签从其他文件中加载bean定义,如下所示:


 在上述例子中,外部bean定义从三个文件中加载,services.xml,messageSource.xml以及themeSource.xml。所有路径位置都和import标签定义相关,因此,services.xml必须是相同的路径或者在类加载路径上,而messageSource.xml和themeSource.xml必须在resources路径下。正如你所看到的,前倒斜杠被忽略了,但是这些路径都是相对路径,一般最好不用斜杠。文件中引入的内容,包含最高级别的<beans/>元素,都必须是Spring模式下有效的XML bean定义。

3. 使用容器

  ApplicationContext是一个接口,用来管理不同beans和它们依赖的注册。使用方法 T getBean(String name, Class<T> requiredType),你可以检索到beans的实例。

   ApplicationContext可以让开发者读取bean定义并获取他们,如下所示:


你可以使用getBean方法来检索beans。ApplicationContext接口有一些其他的方法用来检索beans,但是一般情况下你的应用代码不应该使用到他们。实际上,你的应用不会调用getBean方法,所以应用不需要依赖Spring APIs。例如,Spring整合了web框架,提供了对各种web框架组件的依赖注入,比如控制器,JSF-managed beans,允许你通过元数据(比如autowiring注解)在特定的bean上声明依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值