ioc 3.0 spring 容器和bean

一、bean 介绍

在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。

二、容器(兵工厂)

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。

在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

Spring为我们提供了许多易用的BeanFactory实现, XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象 以及对象间的依赖关系。XmlBeanFactory类将获取此XML配 置元数据,并用它来构建一个完全可配置的系统或应用。

在这里插入图片描述
从上图可以看到,Spring IoC容器将读取配置元数据; 并通过它对应用中各个对象进行实例化、配置以及组装。通常情况下我们使用简单直观 的XML来作为配置元数据的描述格式。在XML配置元数据中我们可以对那些我们希望通过 Spring IoC容器管理的bean进行定义。

Spring IoC容器可以通过多种途径来加载配置元数据,比如本地文件 系统、Java CLASSPATH等。

在大多数的应用程序中,并不需要用显式的代码去实例化一个或多个的Spring IoC 容器实例。例如,在web应用程序中,我们只需要在web.xml中添加 (大约)8 行简单的XML描述符即可

Spring IoC容器至少包含一个bean定义,但大多数情况下会有多个bean定义。当使用 基于XML的配置元数据时,将在顶层的元素中配置一个 或多个元素。

bean定义与应用程序中实际使用的对象一一对应。通常情况下bean的定义包括:服务层对象、数据访问层对象(DAO)、类似Struts Action的 表示层对象、Hibernate SessionFactory对象、JMS Queue对象等等。

<?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
        https://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>

  1. 该 id 属性是一个字符串,用于标识单个 bean 定义。
  2. 该 class 属性定义 bean 的类型并使用完全限定的类名。

三、实例化容器

ApplicationContext context = new ClassPathXmlApplicationContext(
        new String[] {"services.xml", "daos.xml"});

// an ApplicationContext is also a BeanFactory (via inheritance)
BeanFactory factory = context;

1. xml 配置元数据的结构

将XML配置文件分拆成多个部分是非常有用的。为了加载多个 XML 文件生成一个 ApplicationContext 实例,可以将文件路径作为字符串数组传给 ApplicationContext 构造器 。而 bean factory 将通过调用 bean defintion reader 从多个文件中读取 bean 定义。

通常情况下,Spring团队倾向于上述做法,因为这样各个配置并不会查觉到它们 与其他配置文件的组合。(我以为只有我,我也以为只有我)

另外一种方法是使用一个或多个的元素 来从另外一个或多个文件加载bean定义。所有的元素必 须在元素之前完成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>

从3个外部文件:services.xml、 messageSource.xml 及 themeSource.xml 来加载 bean 定义。

这里采用的都是相对路径,因此,此例中的 services.xml 一定要与导入文件放在同一目录或类路径,而
messageSource.xml 和 themeSource.xml 的文件位置必须放在导入文件所 在目录下的 resources
目录中。

开头的斜杠 ‘/’实际上可忽略。因此不用斜杠‘/’可能会更好一点。根据Spring XML配置文件的
Schema(或DTD),被导入文件必须是完全有效的 XML bean 定义文件,且根节点必须为 元素。

2. BeanDefinition 对象

Spring IoC 容器将管理一个或多个 bean,这些 bean 将通过配置文件中的 bean定义 被创建(在XML格式中为元素)。
在容器内部,这些 bean 定义由 BeanDefinition 对象来表示,该定义将包含以下信息:

  • 全限定类名:这通常就是已定义 bean 的实际实现类。

  • bean 行为的定义,这些定义将决定 bean 在容器中的行为(作用域、生命周期回调等等)

  • 对其他 bean 的引用,这些引用 bean 也可以称之为协作 bean(collaborators) 或依赖 bean(dependencies).

  • 创建 bean 实例时的其他配置设置。比如使用 bean 来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。

也就是为每个 bean 定义包含的一组 properties。
在这里插入图片描述
在这里插入图片描述

四、bean 的命名

1. 命名方式

bean 的命名采用标准的 Java 命名约定,即小写字母开头,首字母大写间隔 的命名方式。如 accountManager、 accountService、userDao及 loginController,等等。

对 bean 采用统一的命名约定将会使配置更加简单易懂。而且在使用 Spring AOP 时 ,如果要发通知(advice)给与一组名称相关的 bean 时,这种简单的命名方式将会令你受益匪浅。

id

每个 bean 都有一个或多个 id (标识符或名称)。这些id在当前 IoC 容器中必须唯一。如果 一个 bean 有多个 id,则被认为是别名。

当使用基于XML的配置元数据时,将通过 id 或 name 属性来指定 bean 标识符。id属性具有唯一性, 而且是一个真正的XML ID属性,因此其他 xml 元素在引用该 id 时,可以利用XML解析器的验证功能。通常情况下最好为 bean 指定一个id。

name

除了使用指定的XML字符来作为id,还可以为 bean 指定别名,可以在name属性中使用逗号、 冒号或者空格将多个id分隔。

注意:为一个 bean 提供一个 name 并不是必须的,如果没有指定,那么容器将为其生成一个惟一的name。

2. bean 的别名

在对bean进行定义时,除了使用id属性来指定名称之外,为了提供多个名称,需要通过name属性来加以指定 。而所有的这些名称都指向同一个bean,在某些情况下提供别名非常有用,比如为了让应用的每一个组件能更容易的对公共组件进行引用。

alias

然而,在定义bean时就指定所有的别名并不是总是恰当的。(因为业务需求一直在变化,谁能预料到以后全部的事呢)有时我们期望能在当前位置为那些在别处定义的bean引入别名。

在XML配置文件中,可用 元素来完成bean别名的定义。如:

<alias name="fromName" alias="toName"/>

这里如果在容器中存在名为fromName的bean定义, 在增加别名定义之后,也可以用toName来引用。

例子

组件A在XML配置文件中定义了一个名为 componentA-dataSource 的 DataSource bean。但组件 B 却想在其XML文件中 以componentB-dataSource的名字来引用此 bean。而且在主程序MyApp的XML配 置文件中,希望以 myApp-dataSource 的名字来引用此 bean。最后容器加载三个 XML文件来生成最终的ApplicationContext,在此情形下,可通过在 MyApp XML 文件中添加下列alias元素来实现:

<alias name="componentA-dataSource" alias="componentB-dataSource"/>
<alias name="componentA-dataSource" alias="myApp-dataSource" />

这样一来,每个组件及主程序就可通过唯一名字来引用同一个数据源而互不干扰。

五、实例化 bean

1. 用构造器来实例化

当采用构造器来创建bean实例时,Spring对class并没有特殊的要求, 我们通常使用的class都适用。也就是说,被创建的类并不需要实现任何特定的 接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据所采用 的IoC类型,class可能需要一个默认的空构造器。

此外,IoC 容器不仅限于管理 JavaBean,它可以管理任意的类。不过大多数使用 Spring 的人喜欢使用实际的 JavaBean (具有默认的(无参)构造器 及setter和getter方法),但在容器中使用非 bean 形式(non-bean style)的类也是可 以的。比如遗留系统中的连接池,很显然它与JavaBean 规范不符,但 Spring 也能管理它。

当使用基于XML的元数据配置文件,可以这样来指定bean类:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>

2. 使用静态工厂方法实例化

当采用静态工厂方法创建 bean 时,除了需要指定class 属性外,还需要通过 factory-method 属性来指定创建 bean 实例 的工厂方法。Spring将调用此方法返回实例对象,就此而言, 跟通过普通构造器创建类实例没什么两样。

下面的 bean 定义展示了如何通过工厂方法来创建 bean 实例。注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中, createInstance() 必须是一个static方法。

<bean id="exampleBean"
      class="examples.ExampleBean2"
      factory-method="createInstance"/>

3. 使用实例工厂方法实例化

与 使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外一个 bean 中,容器将调用该 bean 的工厂方法来创建一个新的bean实例。为使用此机制,class属性必须为空,而 factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的 bean 的名称,而该工厂 bean 的工厂方法本身必须通过 factory-method 属性来设定。

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator">
  <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
      factory-bean="serviceLocator"
      factory-method="createInstance"/>

虽然设置bean属性 的机制仍然在这里被提及,但隐式的做法是由工厂bean自己来管理以及通过依 赖注入(DI)来进行配置。

特别注意,这个是实例化 bean ,并不是依赖注入。两者要区分好,虽然某些方面是一样的。

六、使用容器

从本质上讲,BeanFactory 仅仅只是一个维护 bean定义 以及相互依赖关系的高级工厂接口。通过 BeanFactory 我们可以访问 bean 定义。下面的例子创建了一个 bean 工厂,此工厂 将从 xml 文件中读取 bean 定义:

Resource res = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(res);

接着使用getBean(String) 方法就可以取得 bean 的实例;BeanFactory 提供的方法极其简单。 BeanFactory 接口提供 了非常多的方法,但是对于我们的应用来说,最好永远不要调用它们,当然也包括使用getBean(String)方法,这样可以避免我们对 Spring API的依赖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值