要使应用程序中的Spring容器成功启动,需要同时具备以下3方面的条件:
- Spring框架的类包都已经放到应用程序的类路径下。
- 应用程序为Spring提供完备的Bean配置信息。
- Bean的类都已经放到应用程序的类路径下。
Spring通过一个配置文件描述了Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。
Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
Bean配置信息是Bean的元数据信息,它由以下4个方面组成。
- Bean的实现类。
- Bean的属性信息,如数据源的连接数、用户名、密码等。
- Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配。
- Bean的行为配置,如生命周期范围及生命周期各过程的回调函数等。
它们的相互关系,如下
BeanFactory
诚如其名,BeanFactory是一个类工厂,但它和传统的类工厂不同,传统的类工厂仅负责构造一个或几个类的实例,而BeanFactory是类的通用工厂,他可以创建并管理各种类的对象。
通过BeanFactory获取Bean
beans.xml Cat的配置文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
test类
1 | import com.smart.model.Cat; |
结果
XmlBeanFactory通过Resource装载Spring配置信息并启动IoC容器,然后就可以通过BeanFactory #getBean(beanName)方法从IoC容器中获取Bean了。通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean。
通过ApplicationContext获取Bean
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。
配置文件放置在类路径下
优先使用ClassPathXmlApplicationContext实现类.
1
ApplicationContext ctx=new ClassPathXmlContext("路径");
配置文件放置在文件系统的路径下
可以考虑优先使用FilySystemXmlApplicationContext实现类
1
ApplicationContext ctx=new FilySystemXmlApplicationContext("路径");
指定一组配置文件
1
ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"路径1","路径2"});
类注解配置(@Configuration)
使用AnnotationConfigApplicationContext实现类
1
ApplicationContext ctx=new AnnotationConfigApplicationContext("路径");
示例
1 | public static void main(String[] args) { |
PS:使用的是IDEA,需要注意路径,xml配置文件要放在resources文件夹里中不要放在java文件夹里
它们的区别
ApplicationContext的初始化和BeanFactoy的初始化有一个重大的区别:BeanFactey在初始化容器 时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactey稍长一些。