spring 底层简单分析(一)

spring通过IOC和DI进行bean的依赖和管理,其中spring具体结构如下:

    

其中core container是spring的核心内容包括:

core:为spring提供uitl的支持协助context、bean进行spring管理。

contex:为bean提供spring的环境、提供bean的各种信息。

bean:spring 核心组件中的核心组件,为spring提供Bean,相当于OOP中的Ojbcet。


通过实例理解spring加载过程:


通过ApplicationContext去访问bean.xml文件,其中ApplicationContext结构如下:


①加载bean.xml文件:

食用spring.context下的ApplicationContext,接口继承了不同的加载方式接口EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver。

ListableBeanFactory:访问应用程序组件的Bean factory方法。从org.springframework.beans.factory.ListableBeanFactory继承。
ResourcePatternResolver:以通用方式加载文件资源的能力。从org.springframework.core.io继承。ResourceLoader接口。
ApplicationEventPublisher:向已注册的侦听器发布事件的能力。继承自ApplicationEventPublisher接口。

MessageSource:能够解析消息,支持国际化。从MessageSource接口继承。

ApplicationContext接口继承了BeanFactory接口,spring容器的创建和管理都是通过这个接口来实现的。进一步访问源码可知:

public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {


super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}

}

其中refresh():是否自动刷新下,加载所有bean定义和创建单例对象-一步一步的启动容器工作:

// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.

prepareBeanFactory(beanFactory);

通过ConfigurableListableBeanFactory的getBeanFactory()获取工厂:


这里在ConfigurableListableBeanFactory:继承自ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory这三个接口,间接继承了BeanFactory接口提供了创建bean的三种方式:①以list的形式读取所有的bean,②自动连接bean工厂实现、③配置的方式创建bean

// 在应用程序上下文的标准初始化之后修改其内部bean工厂.
postProcessBeanFactory(beanFactory);
// 注册为bean的工厂处理器.
invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean.
registerBeanPostProcessors(beanFactory);
//初始化此上下文的消息源。
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();



获取Bean:

AbstractApplicationContext中访问上下文环境,DefaultResourceLoader的getBean(name, requiredType)方法获取bean,AbstractBeanFactory的getBean(String name, @Nullable Class<T> requiredType)方法访问bean。进一步通过doGetBean(name, requiredType, null, false)方法获取bean,通过doGetBean的getSingleton(beanName)返回在给定名称下注册的单例对象。进一步来自于DefaultSingletonBeanRegistry下的getSingleton(beanName, true)。来自于DefaultSingletonBeanRegistry下的this.singletonObjects.get(beanName)返回注册的bean实例。整个bean获取过程结束.


此过程为基于xml的spring过程,基于注解的spring只是读取环境不同而已。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值