从源码角度来看BeanFactory和ApplicationContext…
2020-01-14 09:36:28来源:博客园 阅读 ()
从源码角度来看BeanFactory和ApplicationContext的关系
大家好,我是小黑,这是年前的最后一篇推文,提前祝大家新年快乐~~
这次我们从源码角度来聊聊BeanFactory和ApplicationContext的关系,讲一些网上文章不曾提到的点。
官方描述
先来看一下官方文档中关于BeanFactory和ApplicationContext的描述。
The
org.springframework.beansandorg.springframework.contextpackages are the basis for Spring Framework’s IoC container. TheBeanFactoryinterface provides an advanced configuration mechanism capable of managing any type of object.ApplicationContextis a sub-interface ofBeanFactory. It adds:
Easier integration with Spring’s AOP features
- Message resource handling (for use in internationalization)
- Event publication
Application-layer specific contexts such as the
WebApplicationContextfor use in web applications.https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/core.html#beans-beanfactory
从官方文档可以了解到:
BeanFactory接口提供了能够管理任何类型对象的高级配置机制。
ApplicationContext是BeanFactory的子接口,它增加了如下一些功能:
- 更容易与 Spring 的 AOP 集成
- 消息资源处理,用于国际化
- 事件发布
- 特定于应用程序层的上下文,如用于 web 应用程序的
WebApplicationContext。
源码简析
以下源码基于 Spring 5.0.13 版本。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
public interface ListableBeanFactory extends BeanFactory
从源码可以证实到,ApplicationContext继承了BeanFactory。
@Configurable
public class Main {
@Autowired
BeanFactory beanFactory;
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);
Main bean = context.getBean(Main.class);
// false
System.out.println(context == bean.beanFactory);
context.close();
}
}
AnnotationConfigApplicationContext是ApplicationContext的一个实现类,换而言之,AnnotationConfigApplicationContext也是BeanFactory的一个实现类。
但是,运行上述代码,System.out.println(context == bean.beanFactory);的输出结果为false。
这是不是意味着,在容器中,ApplicationContext和BeanFactory是两个不同的实例对象呢?
BeanFactory 和 ApplicationContext
在AnnotationConfigApplicationContext中有一个getBeanFactory方法。
准确来说,是org.springframework.context.support.AbstractApplicationContext#getBeanFactory。
@Configurable
public class Main {
@Autowired
BeanFactory beanFactory;
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);
Main bean = context.getBean(Main.class);
// false
System.out.println(context == bean.beanFactory);
// true
System.out.println(context.getBeanFactory() == bean.beanFactory);
context.close();
}
}
AbstractApplicationContext是ApplicationContext的抽象实现。
AnnotationConfigApplicationContext继承了GenericApplicationContext,而GenericApplicationContext又继承了AbstractApplicationContext。

在AbstractApplicationContext中,所有BeanFactory接口的实现,都是委托给了BeanFactory对象。
// AbstractApplicationContext#getBean(java.lang.Class<T>, java.lang.Object...)
public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
assertBeanFactoryActive();
return getBeanFactory().getBean(requiredType, args);
}
// AbstractApplicationContext#getBeanFactory
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
getBeanFactory()是一个抽象方法用。
GenericApplicationContext实现了该抽象方法:
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {
private final DefaultListableBeanFactory beanFactory;
...
public final ConfigurableListableBeanFactory getBeanFactory() {
return this.beanFactory;
}
...
}
总结
ApplicationContext是BeanFactory的子接口,但是ApplicationContext的实例对象和BeanFactory的实例对象并不是同一个。
在ApplicationContext的实现中,有一个成员变量DefaultListableBeanFactory beanFactory,所有和BeanFactory接口相关的功能都是委派给这个成员变量来实现的。
ApplicationContext实现类中的beanFactory成员变量和容器中的BeanFactory才是同一个实例对象。
原文链接:https://www.cnblogs.com/coderxiaohei/p/12191488.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 你说研究过Spring里面的源码,循环依赖你会么? 2020-06-09
- 来看看阿里架构师Java 代码打日志姿势!你也是这样写的吗 2020-06-08
- 通俗理解spring源码(六)—— 默认标签(import、alias、be 2020-06-07
- 学习源码的第八个月,我成了Spring的开源贡献者 2020-06-02
- 最新115道经典Java面试题及答案解析,快来看看你掌握了多少 2020-06-01
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
