Spring IoC容器和bean的介绍
这是一个对象定义他们的依赖的过程,容器在创建bean时注入这些依赖。因为不再是自己new依赖,让spring控制,所以也叫做控制反转(IoC)。
BeanFactory接口提供了配置框架和基本功能。ApplicationContext是BeanFactory的子接口,它提供更多企业级应用的相关功能。
容器概述
org.springframework.context.ApplicationContext接口代表了Spring IoC容器,它通过读取配置来实例化,组装和配置上面所说的bean。配置的主要形式有XML,Java注解和Java代码,它允许你来定义应用中的对象和他们之间复杂的依赖关系。
下图为Spring如何工作的抽象视图。应用中的类被配置文件整合起来了,所以在ApplicationContext被创建和初始化后,你已经有一个完全配置和可执行的系统或应用了。
配置元数据
三种方式:
1、基于XML配置
2、基于注解配置
3、基于Java配置
详见Spring的Ioc配置元数据的三种方式
实例化一个容器对象
实例化一个Spring IoC容器非常简单。传递给ApplicationContext构造方法的相对路径或绝对路径,实际上是资源的路径,它允许容器从外部各种资源(例如本地文件系统,Java类路径等等)加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
编写基于XML的配置文件
通过多个XML配置文件来定义bean是非常有必要的。通常,在你的架构中,每一个XML配置文件表示特定的逻辑层或模块。
你可以使用application context构造方法来从所有的XML来加载bean。这个构造方法可以接受多个资源,如上一节所示。还有一种选择,使用<import/>
标签来加载其他的XML配置文件,如下面例子:
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
使用容器
接口ApplicationContext是一个高级工厂的接口,它能够维护不同bean及其依赖项的注册表。使用方法getBean(String name, Class<T>
requiredType)可以让你检索到bean的实例,如下所示:
// 创建ApplicationContext实例,加载bean配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// 从上述配置文件中配置的bean中,检索你所需要的bean
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// 使用配置好的实例,这就是具体的业务代码了
List<String> userList = service.getUsernameList();
实际上,你的代码里连getBean()都不需要调用,项目中一般使用@Autowire等注解,所以也就不需要依赖于Spring的API。
bean概述
一个Spring IoC容器管理一个或多个bean。这些bean是根据你提供给容器的配置来被容器创建的,例如在XML配置中,<bean/>
标签下的配置。
除了包含创建bean的特定信息以外,ApplicationContext的实现类还允许用户通过调用getBeanFactory()方法在容器外创建现有对象。这个方法会返回BeanFactory的实现类DefaultListableBeanFactory。
实例化bean
作为代表性的,如果通过容器本身直接实例化bean,指定要构建的bean的类,通过反射调用类的构造方法,这等同于Java的new操作。
如果你是基于XML来配置bean的,你可以在<bean/>
的class属性中指定对象的类型。有两种使用Class属性的方式:
1、通过容器本身直接实例化bean,指定要构建的bean的类,通过反射调用类的构造方法,这等同于Java的new操作。
2、较少的情况,指定的实际类,含有一个静态的工厂方法,调用这个工厂方法后可以实例化bean。从调用静态工厂方法返回的对象类型可以是相同的类或其他类。
在Spring文档中,工厂bean指的是在Spring容器中配置好的bean,它将通过一个实例工厂或静态工厂来创建对象。与之相比,FactoryBean(注意这个是一个类名)是指Spring中的一个接口,请不要混淆!