请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

从源码角度来看BeanFactory和ApplicationContext的关系

[复制链接]
查看: 81|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81372
发表于 2020-1-14 15:18 | 显示全部楼层 |阅读模式
大家好,我是小黑,这是年前的末端一篇推文,提早祝大家新年欢畅~~
此次我们从源码角度来聊聊BeanFactory和ApplicationContext的关系,讲一些网上文章不曾提到的点。
官方描摹

先来看一下官方文档中关于BeanFactory和ApplicationContext的描摹。
The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container. The BeanFactoryinterface 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 WebApplicationContext for 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 版本。
  1. public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,        MessageSource, ApplicationEventPublisher, ResourcePatternResolver
复制代码
  1. public interface ListableBeanFactory extends BeanFactory
复制代码
从源码可以证实到,ApplicationContext继续了BeanFactory。
  1. @Configurablepublic 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。
  1. @Configurablepublic 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。
从源码角度来看BeanFactory和ApplicationContext的关系  游戏 1822265-20200114131158772-1712828395

在AbstractApplicationContext中,全数BeanFactory接口的实现,都是拜托给了BeanFactory工具。
  1. // AbstractApplicationContext#getBean(java.lang.Class, java.lang.Object...)public  T getBean(Class requiredType, Object... args) throws BeansException {  assertBeanFactoryActive();  return getBeanFactory().getBean(requiredType, args);}
复制代码
  1. // AbstractApplicationContext#getBeanFactorypublic abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
复制代码
getBeanFactory()是一个笼统方式用。
GenericApplicationContext实现了该笼统方式:
  1. 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才是同一个实例工具。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表