Container概览
ApplicationContext接口代表了Spring IoC container以及负责初始化,配置,组合beans,这些是根据读取配置文件(XML或者Java注解或者Java代码,你需要在配置文件中表述构建应用所需要的对象那个,以及它们之间的依赖)进行的。
Spring提供了ApplicationContext接口的几个实现。在一个独立运行的应用中,通常使用ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext。XML是定义配置文件的传统格式,不过可以提供一点XML注解来的声明性地启用对其它配置格式的支持。
在大多数的应用场景下,用户不需要使用代码去显示地初始化一个或更多的Spring IoC container。例如一个web 应用的场景,web.xml即可,或者使用Spring Boot不需要手动配置,只需要使用生成的Main方法中的SpringApplication.run()
。
配置文件
对于XML配置的文件,需要在顶层元素<beans>中定义</bean>元素,而在Java的配置方式中,需要在注解为@Configuration的类中定义注解为@Bean的方法。一个bean至少需要一个Class信息。
初始化一个Container
有一些实现了ApplicationContext的类与资源的路径相关比如ClassPathXmlApplicationContext,会在classpath中读取给定的配置文件从而实例化。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
除了直接在实例化的时候提供文件信息,也可以在xml的配置文件的顶层元素<Beans>下使用< import resourse = "filename">来使一个配置文件包含另一个配置文件,当这个配置文件被加载时,其包含的配置文件也被加载。</import>这个指令时命名空间自身提供的,其他的命名空间会有其他的指令。
使用url来定位配置文件时,不建议使用绝对路径或者使用../跳转到上级路径,作为替代可以使用&{pathToBeParsed}占位符。
使用Container
ApplicationContext是一个拥有一个bean和其依赖的注册机的高级工厂类的接口。使用T getBean(String name, Class
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
PetStoreService service = context.getBean("petStore", PetStoreService.class);
这些实现中最具弹性的变体是GenericApplicationContext,这个实现可以将其他Reader类实例作为代理来组合,例如:
GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();
注意:在实例化XmlBeanDefinitionReader时使用了context作为构造参数,使其称为context的一个代理,然后在调用了它的加载配置文件的方法。
实际上,你并不需要调用这个getBean方法,从而与Spring架构解耦合,而依赖的注入将由Spring自动进行。