Spring容器Container概述


org.springframework.context.ApplicationContext 接口表示Spring IoC 容器,并负责实例化,配置和组装Bean 。容器通过读取配置元数据获取有关要实例化,配置和组装哪些对象的指令。配置元数据以XML Java 注解或Java`代码表示。它使您能够表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。

Spring提供了ApplicationContext接口的几种实现。在独立应用程序中,通常创建ClassPathXmlApplicationContextFileSystemXmlApplicationContext的实例。尽管XML是定义配置元数据的传统格式,但是您可以通过提供少量XML配置来声明性地启用对这些其他元数据格式的支持,从而指示容器将Java注解或代码用作元数据格式。

​ 在大多数应用场景中,不需要显式用户代码即可实例化一个Spring IoC容器的一个或多个实例。例如,在Web应用程序场景中,应用程序的web.xml文件中的简单八行(约)样板Web描述符XML通常就足够了。

​ 下图显示了Spring的工作原理的高级视图。您的应用程序类与配置元数据结合在一起,以便在创建和初始化ApplicationContext之后,您将拥有一个完全配置且可执行的系统或应用程序。

在这里插入图片描述

1.2.1 如何配置Spring容器的元数据

​ 如上图所示,Spring IoC容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉Spring容器实例化,配置和组装应用程序中的对象,传统上配置元数据以简单直观的XML格式提供。

:基于XML的元数据不是配置元数据的唯一允许形式,还有基于Spring 2.5引入的注解形式配置Spring容器元数据和Spring 3.0引入的java形式配置Spring容器元数据的。 Spring IoC容器本身与实际写入此配置元数据的格式完全脱钩。现在一般都选择基于注解和Java的配置。

Spring配置由容器必须管理的至少一个(通常是一个以上)bean定义组成。基于XML的配置元数据将这些bean配置为顶级<beans />元素内的<bean />元素。 Java配置通常在@Configuration类中使用@Bean注解的方法。

​ 这些bean定义对应于组成应用程序的实际对象。通常,您定义服务层对象,数据访问对象(DAO),表示对象(例如Struts Action实例),基础结构对象(例如Hibernate SessionFactories,JMS队列)等等。通常,不会在容器中配置细粒度的域对象,因为创建和加载域对象通常是DAO和业务逻辑的职责。但是,您可以使用Spring与AspectJ的集成来配置在IoC容器控制之外创建的对象。

​ 以下示例显示了基于XML(ioc-config.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <bean id="testBean"
            class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean">
        </bean>
        <bean id="testBeanB1" name="testBeanBResource"
           class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB">
        </bean>
</beans>
1. `id`属性是标识单个`bean`定义的字符串
2. `class`属性定义`bean`的类型并使用完全限定的类路径。
1.2.2 如何实例化一个Spring实例对象

​ 提供给ApplicationContext构造函数的位置路径是资源字符串,这些资源字符串使容器可以从各种外部资源(例如本地文件系统,Java CLASSPATH等)加载配置元数据。

​ 以下示例显示了基于XML的配置元数据的如何实例化一个Spring容器用法:

public class CommonTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("ioc-config.xml");
        TestBean testBean = applicationContext.getBean("testBean", TestBean.class);
        System.out.println(testBean.fun());
    }
}

​ 以下示例显示了基于XML的配置元数据的定义了testBean,testBeanB1的用法:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <bean id="testBean"
 class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean">
            <property name="testBeanA" ref="testBeanB1"/>
        </bean>
        <bean id="testBeanB1" name="testBeanBResource"
        class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB">
            <property name="name" value="qualifier"/>
        </bean>
</beans>

​ 在前面的示例中,testBeantestBeanB1对象组成。属性名称元素引用JavaBean属性的名称,而ref元素引用另一个bean定义的名称。idref元素之间的这种联系表达了协作对象之间的依赖性。

  • 如何在XML配置文件中组合其他XML配置文件

    ​ 使bean定义跨越多个XML文件可能很有用。通常,每个单独的XML配置文件都代表体系结构中的逻辑层或模块。

    ​ 您可以使用应用程序上下文构造函数从所有这些XML片段中加载bean定义。使用<import />元素的一个或多个实例从另一个文件中加载bean定义。以下示例显示了如何执行此操作:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        	<import resource="spring-config.xml"/>
        	<import resource="DAO.xml"/>
        
            <bean id="testBean"
     class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean">
                <property name="testBeanA" ref="testBeanB1"/>
            </bean>
            <bean id="testBeanB1" name="testBeanBResource"
            class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB">
                <property name="name" value="qualifier"/>
            </bean>
    </beans>
    
1.2.3 Spring容器如何使用

ApplicationContext是高级工厂的接口,该工厂能够维护不同bean及其依赖关系的注册表。通过使用方法T getBean(String name,Class <T> requiredType),可以获得bean`的实例。

​ 通过ApplicationContext,您可以读取Bean定义并访问它们,如以下示例所示:

public class CommonTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("ioc-config.xml");
        TestBean testBean = applicationContext.getBean("testBean", TestBean.class);
        System.out.println(testBean);
    }
}

​ 最灵活的变体是GenericApplicationContext与读取器委托结合使用,例如,与XML文件的XmlBeanDefinitionReader结合使用,如以下示例所示:

public class CommonTest {
    public static void main(String[] args) {
        GenericApplicationContext app = new GenericApplicationContext();
        new XmlBeanDefinitionReader(app).loadBeanDefinitions("ioc-config.xml");
        app.refresh();
        TestBean testBean = app.getBean("testBean", TestBean.class);
        System.out.println(testBean);
    }
}

​ 您可以在同一ApplicationContext上混合和匹配此类阅读器委托,从不同的配置源读取Bean定义。

​ 然后,您可以使用getBean获得bean的实例。 ApplicationContext接口还有其他几种检索bean的方法,但是理想情况下,您的应用程序代码永远不要使用它们。实际上,您的应用程序代码应该根本不调用getBean()方法,因此完全不依赖于Spring API。例如,Spring与Web框架的集成为各种Web框架组件提供了依赖项注入,使您可以通过元数据(例如自动装配注释)声明对特定Bean的依赖项。

参考文献

【https://docs.spring.io/spring-framework/docs/current/reference/html/core.html】【1.2. Container Overview】

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值