org.springframework.context.ApplicationContext
接口表示
Spring IoC
容器,并负责实例化,配置和组装
Bean
。容器通过读取配置元数据获取有关要实例化,配置和组装哪些对象的指令。配置元数据以
XML
,
Java
注解或
Java`代码表示。它使您能够表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。
Spring
提供了ApplicationContext
接口的几种实现。在独立应用程序中,通常创建ClassPathXmlApplicationContext
或FileSystemXmlApplicationContext
的实例。尽管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>
在前面的示例中,testBean
由testBeanB1
对象组成。属性名称元素引用JavaBean
属性的名称,而ref
元素引用另一个bean
定义的名称。id
和ref
元素之间的这种联系表达了协作对象之间的依赖性。
-
如何在
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】