BeanFactory与ApplicationContext的关系
Spring的Bean工厂
,ApplicationContext是后期更高级接口,称之为Spring容器
;监听功能、国际化功能
等。BeanFactory
的API更偏向底层
,ApplicationContext
的API大多数是对这些底层API的封装
;ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用
,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载
,容器一创建就将Bean都实例化并初始化好。ApplicationContext除了继承了BeanFactory外,还继承了ApplicationEventPublisher(事件发布器)、
ResouresPatternResolver(资源解析器)、MessageSource(消息资源)等。但是ApplicationContext的核心功能还是BeanFactory。
BeanFactory与ApplicationContext的关系
applicationContext内部维护着beanFactory的引用,在学习过程中会查看beanFactory内部维护的属性,断点查看如下图示内容的:
BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是
DefaultListableBeanFactory
,而ApplicationContext内部维护的Beanfactory的实现类也是它。轮层级来说,真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory
,因此可以这么说,DefaultListableBeanFactory
是整个spring ioc的始祖。
只导入spring-context坐标时,BeanFactory关系图如下:
只在Spring基础环境下,常用的三个ApplicationContext作用如下:
验证BeanFactory和ApplicationContext对Bean的初始化时机,ApplicationContext
和BeanFactory
区别我们可以通过classPathXmlApplicationContext
和XmlBeanFactory
来进行比较,classPathXmlApplicationContext
属于ApplicationContext
,而 XmlBeanFactory
属于BeanFactory
系列的,XmlBeanFactory
继承自DefaultListableBeanFactory
,重写了一些功能,使自己更强大。
(1)添加依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.23version>
dependency>
(2)添加TestController 和 TestService
public class TestController {
public TestController() {
System.out.println("TestController初始化了");
}
public void method1(){
System.out.println("method1");
}
public void method2(){
System.out.println("method2");
}
}
public class TestService {
public TestService() {
System.out.println("TestService初始化了");
}
public void method1() {
// 业务省略...
}
public void method2() {
// 业务省略...
}
}
(3)添加bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="testService" class="com.gzl.cn.service.TestService"/>
<bean id="testController" class="com.gzl.cn.controller.TestController"/>
beans>
public class Client {
public static void main(String[] args) {
XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml"));
}
}
运行结果:并没有访问无参构造器初始化,当通过XmlBeanFactory 第一次访问getBean方法的时候才会触发初始化!
接下来再来看classPathXmlApplicationContext:
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:bean.xml");
}
}
运行结果:不管使用没使用都会触发初始化!
如果Spring基础环境中加入了其他组件解决方案,如web层解决方案,即导入spring-web坐标,此时
ApplicationContext的继承体系:
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>5.3.23version>
dependency>
在Spring的web环境下,常用的两个ApplicationContext作用如下:
web环境下的这两个ApplicationContext,在Spring集成web时使用。