摘要:容器概述接口表示容器,负责实例化配置和组装。基于的元数据不是惟一允许的配置元数据形式,容器本身与实际编写配置元数据的格式完全解耦,现在,许多开发人员为他们的应用程序选择基于的配置。
容器概述
org.springframework.context.ApplicationContext接口表示Spring IoC容器,负责实例化、配置和组装bean。容器通过读取配置元数据获取关于要实例化、配置和组装哪些对象的指令,配置元数据用XML、Java注解或Java代码表示,它允许你表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
Spring提供了ApplicationContext接口的几个实现,在独立应用程序中,通常创建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例。虽然XML一直是定义配置元数据的传统格式,但是你可以通过提供少量XML配置来声明支持这些额外的元数据格式,从而指示容器使用Java注解或代码作为元数据格式。
在大多数应用程序场景中,不需要显式用户代码来实例化Spring IoC容器的一个或多个实例。例如,在web应用程序场景中,在应用程序的web.xml文件中使用8行左右的简单样例web描述符XML就足够了(请参阅方便的web应用程序的ApplicationContext实例化)。如果使用Spring Tool Suite(一个Eclipse支持的开发环境),只需单击几下鼠标或按键,就可以轻松创建这个样板配置。
下图显示了Spring如何工作的高级别视图,你的应用程序类与配置元数据相结合,这样,在创建并初始化ApplicationContext之后,你就拥有了一个完全配置的可执行系统或应用程序。
配置元数据如上图所示,Spring IoC容器使用一种配置元数据形式,作为应用程序开发人员,此配置元数据表示如何告诉Spring容器在应用程序中实例化、配置和组装对象。
配置元数据通常以简单直观的XML格式提供,本章的大部分内容都使用这种格式来传达Spring IoC容器的关键概念和特性。
基于XML的元数据不是惟一允许的配置元数据形式,Spring IoC容器本身与实际编写配置元数据的格式完全解耦,现在,许多开发人员为他们的Spring应用程序选择基于java的配置。
有关在Spring容器中使用其他形式的元数据的信息,请参见:
基于注解的配置:Spring 2.5引入了对基于注解的配置元数据的支持。
基于java的配置:从Spring 3.0开始,Spring JavaConfig项目提供的许多特性成为Spring Framework核心的一部分,因此,你可以使用Java而不是XML文件来定义应用程序类外部的bean,要使用这些新特性,请参见@Configuration、@Bean、@Import和@DependsOn注解。
Spring配置包含容器必须管理的至少一个bean定义,并且通常包含多个bean定义,基于XML的配置元数据将这些bean配置为顶级
这些bean定义对应于组成应用程序的实际对象,通常,你定义服务层对象、数据访问对象(DAO)、表示对象(如Struts Action实例)、基础设施对象(如Hibernate SessionFactories)、JMS Queues等等。通常,不会在容器中配置细粒度域对象,因为通常由DAO和业务逻辑负责创建和加载域对象。不过,你可以使用Spring与AspectJ的集成来配置在IoC容器控制之外创建的对象。
下面的例子展示了基于XML的配置元数据的基本结构:
id属性是标识单个bean定义的字符串。
class属性定义bean的类型并使用完全限定的类名。
id属性的值引用协作对象,本例中没有显示用于引用协作对象的XML,有关更多信息,请参见依赖关系。
实例化一个容器提供给ApplicationContext构造函数的位置路径或路径是资源字符串,允许容器从各种外部资源(如本地文件系统、Java CLASSPATH等)加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
在了解了Spring的IoC容器之后,你可能想了解更多关于Spring的Resource抽象的信息,它提供了一种方便的机制,可以从URI语法中定义的位置读取InputStream,特别是,Resource路径用于构造应用程序上下文。
下面的示例显示了服务层对象(services.xml)配置文件:
下面的例子展示了数据访问对象daos.xml文件:
在前面的示例中,服务层由PetStoreServiceImpl类和两个数据访问对象JpaAccountDao和JpaItemDao类型(基于JPA对象关系映射标准)组成,property name元素引用JavaBean属性的名称,ref元素引用另一个bean定义的名称。id和ref元素之间的这种链接表示协作对象之间的依赖关系,有关配置对象依赖关系的详细信息,请参见依赖关系。
组合基于XML的配置元数据让bean定义跨多个XML文件是很有用的,通常,每个多带带的XML配置文件表示体系结构中的逻辑层或模块。
你可以使用应用程序上下文构造函数从所有这些XML片段加载bean定义,这个构造函数接受多个Resource位置,如前一节所示。或者,使用一个或多个
在前面的示例中,外部bean定义从三个文件加载:services.xml、messageSource.xml和themeSource.xml,所有位置路径都相对于执行导入的定义文件,因此services.xml必须与执行导入的文件位于相同的目录或类路径位置,而messageSource.xml和themeSource.xml必须位于导入文件位置下方的resources位置。可以看到,前面的斜杠被忽略了,但是,由于这些路径是相对的,所以最好不要使用斜杠,根据Spring Schema,导入的文件的内容,包括顶层
它是可能的,但不推荐,在父目录中引用文件使用一个相对"../“路径,这样做会创建对当前应用程序外部文件的依赖。特别地,这个引用不推荐用于classpath:url(例如,classpath:../services.xml),其中运行时解析过程选择“最近的”类路径根,然后查看其父目录,类路径配置更改可能导致选择不同的、不正确的目录。你总是可以使用完全限定的资源位置,而不是相对路径:例如,file:C:/config/services.xml或classpath:/config/services.xml,但是,请注意,你正在将应用程序的配置耦合到特定的绝对位置。通常更可取的做法是为这些绝对位置保留一个间接的位置 — 例如,通过“${…}”占位符,这些占位符在运行时对JVM系统属性解析。
名称空间本身提供导入指令特性,除了普通bean定义之外,Spring提供的XML名称空间的选择还提供了其他配置特性 — 例如context和util名称空间。
Groovy Bean Definition DSL作为外部化配置元数据的另一个示例,bean定义也可以用Spring的Groovy Bean Definition DSL表示,Grails框架中有这样的定义,通常,这种配置存在于“.groovy”文件中,其结构如下例所示:
beans { dataSource(BasicDataSource) { driverClassName = "org.hsqldb.jdbcDriver" url = "jdbc:hsqldb:mem:grailsDB" username = "sa" password = "" settings = [mynew:"setting"] } sessionFactory(SessionFactory) { dataSource = dataSource } myService(MyService) { nestedBean = { AnotherBean bean -> dataSource = dataSource } } }
这种配置风格在很大程度上等同于XML bean定义,甚至支持Spring的XML配置名称空间,它还允许通过importBeans指令导入XML bean定义文件。
使用容器ApplicationContext是高级工厂的接口,该工厂能够维护不同bean及其依赖项的注册表,通过使用方法T getBean(String name, Class
ApplicationContext允许你读取bean定义并访问它们,如下面的示例所示:
// create and configure beans ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); // retrieve configured instance PetStoreService service = context.getBean("petStore", PetStoreService.class); // use configured instance ListuserList = service.getUsernameList();
对于Groovy配置,引导看起来非常类似,它有一个不同的上下文实现类,它支持Groovy(但也理解XML bean定义),下面的示例显示了Groovy配置:
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
最灵活的变体是GenericApplicationContext与reader委托相结合 — 例如,使用XmlBeanDefinitionReader来处理XML文件,如下例所示:
GenericApplicationContext context = new GenericApplicationContext(); new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml"); context.refresh();
你还可以对Groovy文件使用GroovyBeanDefinitionReader,如下面的示例所示:
GenericApplicationContext context = new GenericApplicationContext(); new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy"); context.refresh();
你可以在相同的ApplicationContext上混合和匹配这样的reader委托,从不同的配置源读取bean定义。
然后可以使用getBean检索bean的实例,ApplicationContext接口还有一些用于检索bean的其他方法,但在理想情况下,应用程序代码不应该使用它们。实际上,你的应用程序代码应该完全不调用getBean()方法,因此完全不依赖于Spring API。例如,Spring与web框架的集成为各种web框架组件(如控制器和JSF管理的bean)提供了依赖注入,允许你通过元数据(如自动装配注解)声明对特定bean的依赖。
上一篇:Spring IoC容器和bean介绍文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75750.html
摘要:除此之外,还为不同的应用程序体系结构提供了基础支持,包括消息传递事务数据和持久性以及,它还包括基于的框架,以及与之并行的反应性框架。还支持依赖项注入和公共注解规范,应用程序开发人员可以选择使用这些规范,而不是提供的特定于的机制。 概述 Spring使创建Java企业应用程序变得很容易,它提供了在企业环境中使用Java语言所需要的一切,支持Groovy和Kotlin作为JVM上的替代语言...
摘要:概述容器管理一个或多个,这些是使用你提供给容器的配置元数据创建的例如,以定义的形式。在容器内部,这些定义被表示为对象,其中包含其他信息以下元数据包限定的类名通常,定义的实际实现类。 Bean概述 Spring IoC容器管理一个或多个bean,这些bean是使用你提供给容器的配置元数据创建的(例如,以XML 定义的形式)。 在容器内部,这些bean定义被表示为BeanDefinitio...
摘要:容器和介绍本章介绍了控制反转原理的实现,也称为依赖注入。在中,构成应用程序主干并由容器管理的对象称为,是由容器实例化组装和管理的对象,否则,只是应用程序中的许多对象之一,及其之间的依赖关系反映在容器使用的配置元数据中。 Spring IoC容器和bean介绍 本章介绍了控制反转(IoC)原理的Spring Framework实现,IoC也称为依赖注入(DI)。它是一个过程,对象仅通过构...
摘要:简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。切点通过一个条件来匹配要拦截的类,这个条件称为切点。 特点 1. IOC/依赖注入 IOC就是一个负责控制管理对象生命周期和对象间关系的容器。IOC让程序员用关注怎么去创建对象,不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,而是关注对象创建之后的...
摘要:经过年时间的发展,到目前为止,最新稳定版为版本。的发展刚出生的时候,引起了很多开源社区的关注,并且也有个人和企业开始尝试使用。通过项目搭建过程来对比的差异和优势。当然它的作用不仅于此,后续会逐步揭开它的真实面目。而和就相当于当年的和的关系。 要了解Spring Boot的发展背景,还得从2004年Spring ...
阅读 3291·2023-04-26 00:58
阅读 1249·2021-09-22 16:04
阅读 3286·2021-09-02 15:11
阅读 1529·2019-08-30 15:55
阅读 2306·2019-08-30 15:55
阅读 3215·2019-08-23 18:41
阅读 3432·2019-08-23 18:18
阅读 2732·2019-08-23 17:53