在本文中,我们将通过示例讨论什么是Spring IOC容器、它如何工作、如何创建Spring IOC容器、如何从Spring IOC容器获取bean。
我们将学到什么?
- 什么是spring容器?
- 什么是配置元数据?
- 如何创建spring容器?
- 如何从Spring容器中获取Bean?
什么是spring IOC容器?
IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中创建相关的对象,应用程序由IoC容器进行组装。
Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。
由IoC容器管理的那些组成应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean与应用程序中的其他对象没有什么区别了。
IOC容器的职责是:
- 实例化bean
- 把bean关联在一起
- 配置bean
- 管理bean的整个生命周期
org.springframework.beans
和org.springframework.context包是Spring框架的IoC容器的基础。Spring框架提供了两种不同类型的容器。
- BeanFactory容器
- ApplicationContext容器
BeanFactory是Spring IOC容器的根接口。ApplicationContext是BeanFactory接口的子接口,提供更多的功能,如 AOP功能,i18n等。
BeanFactory和ApplicationContext之间的一个主要区别是,BeanFactory只在调用getBean()方法时实例化bean,而ApplicationContext在容器启动时实例化单例bean,它不等待getBean()方法被调用。
什么是配置元数据?
Spring IoC容器使用其中一种方式配置元数据。此配置元数据表示应用程序开发人员如何告诉Spring容器实例化,配置和组装应用程序中的对象。
Spring IoC容器提供了三种方式配置元数据
如何创建spring容器?
Spring 提供了ApplicationContext接口的多种实现方式供我们使用。
-
AnnotationConfigApplicationContext:
如果我们要在Java应用程序中使用Spring,并使用注释进行配置,那么我们可以使用它来初始化容器并获取bean对象。
-
ClassPathXmlApplicationContext:
如果我们在应用程序中使用XML文件的形式配置spring bean,那么我们可以使用这个类来加载文件并获取bean对象。
-
FileSystemXmlApplicationContext:类似于*ClassPathXmlApplicationContext,*不同之处在于可以从文件系统中的任何位置加载XML配置文件。
Web应用程序使用AnnotationConfigWebApplicationContext和XmlWebApplicationContext创建容器。
创建Spring容器:
1、通过applicationContext.xml文件(基于XML的配置)提供配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//注意,我们通过applicationContext.xml文件(基于xml的配置)提供配置元数据。
2、通过AppConfig.class文件提供配置元数据。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//注意,我们通过AppConfig.class文件提供配置元数据。
3、实现BeanFactory的最常用的API是XmlBeanFactory。
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("applicationContext.xml"));
如何从Spring容器中获取Bean?
BeanFactory
和ApplicationContext
两个接口都提供了*getBean()
*方法从spring容器中获取bean。
ApplicationContext getBean()示例:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
BeanFactory getBean()示例:
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");