IoC容器:容器概述(二)
概述
ApplicationContext
接口代表Spring IoC容器,负责实例化
、配置
和组装
Bean- 容器通过读取
配置元数据
来获取关于要实例化、配置和组装哪些对象的指示
配置元数据
以XML
、Java注解
或Java代码
表示,它可以表达构成应用程序的对象以及这些对象之间丰富的相互依赖关系。
接口的常见实现类:ApplicationContext
ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
。
虽然XML
一直是定义配置元数据
的传统格式,但是可以通过提供少量的XML配置来指示容器使用Java注解或代码
作为元数据格式,以声明性地启用对这些额外元数据格式的支持。
在大多数应用场景下,不需要明确的用户代码来实例化Spring IoC容器的一个或多个实例。例如:在Web应用场景中,通常只需要在应用程序的web.xml
文件中编写8行(或更多)模板式的Web描述符就足够了。
下图显示了Spring工作方式的高层视图。应用程序类
与配置元数据
相结合,在ApplicationContext
被创建和初始化后,就会产生一个完全配置好的可执行系统或应用程序。
配置元数据
用于告诉Spring容器在应用中如何实例化、配置和组装对象。配置元数据
配置元数据
在传统上是以简单直观的XML
格式提供的。
除了
基于XML
来设置配置元数据
之外,还可以基于Java代码
或基于注解
来设置。Spring IoC容器本身与这种配置元数据的实际编写格式是完全解耦
的。
Spring的配置至少要有一个,通常是一个以上的Bean定义
,容器必须管理这些定义。
基于XML
的配置元数据将这些Bean配置为顶层基于XML
<beans/>
元素内的<bean/>
元素。通常情况下,每个单独的XML
配置文件代表了架构中的要给逻辑层或模块,因此让Bean的定义跨越多个XML
文件可能很有用。可以使用<import/>
标签从一个或多个文件中加载Bean定义。
XML的命名空间
命名空间本身提供了导入指令的功能。除了普通的Bean定义之外,更多的配置功能可以在Spring 提供的一些XML命名空间中获得,例如,context
和 util
命名空间。
1 |
|
基于Java代码
的配置通常使用被基于Java
@Configuration
注解修饰的类(即配置类)中的被@Bean
注解修饰的方法。
1 | // 定义该类为配置类 |
基于注解
的配置通常使用例如基于注解
@Component
、@Repository
、@Service
、@Controller
这样的注解。使用基于注解的配置时,需要在配置类上使用@ComponentScan
注解启动组件扫描,指定扫描的包路径。
1 | // 通用注解 |
1 | // 定义该类为配置类 |
实例化一个容器
实例化一个容器(ApplicationContext
)时,需要传入一个或多个资源的路径(字符串),它让容器从各种外部资源(如本地文件系统
、Java CLASSPATH
等)中加载配置元数据。
1 | ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", |
使用容器
是一个高级工厂的接口,是能够维护不同Bean及其依赖关系的ApplicationContext
注册表
。通过使用方法 T getBean(String name, Class<T> requiredType)
,可以检索到Bean的实例。
可以读取Bean定义(definition)并访问它们。ApplicationContext
1 | // 创建和配置bean |
最灵活的变体是 GenericApplicationContext
与 reader delegate 的结合。例如,与 XmlBeanDefinitionReader
一起用于XML文件,如下例所示。
1 | GenericApplicationContext context = new GenericApplicationContext(); |
除了使用getBean()
来检索Bean实例之外,ApplicationContext
接口还有其他一些检索Bean的方法。但理想情况下,应用代码不应该使用这些方法,也包括getBean()
方法,因为这样就不会对Spring的API产生依赖性。
在通常情况下,想要获取Bean实例
可以使用依赖注入
的方式。例如,Spring与Web框架的集成为各种Web框架(如controller和JSF管理的Bean)提供了依赖注入,让你通过元数据(如autowiring注解)来声明对特定Bean的依赖。
IoC容器:容器概述(二)