Spring核心容器IOC原理实例解析

网友投稿 239 2022-12-15


Spring核心容器IOC原理实例解析

这篇文章主要介绍了Spring核心容器IOC原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一 、BeanFactory

Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象

间的依赖关系提供了很多便利和基础服务。最基本的 IOC 容器接口 BeanFactory,来看一下它的源码:

public interface BeanFactory {

//对 FactoryBean 的转义定义,因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象,

//如果需要得到工厂本身,需要转义

String FACTORY_BEAN_PREFIX = "&";

//根据 bean 的名字,获取在 IOC 容器中得到 bean 实例

Object getBean(String name) throws BeansException;

//根据 bean 的名字和 Class 类型来得到 bean 实例,增加了类型安全验证机制。

T getBean(String name, @Nullable Class requiredType) throws BeansException;

Object getBean(String name, Object... args) throws BeansException;

T getBean(Class requiredType) throws BeansException;

T getBean(Class requiredType, Object... args) throws BeansException;

//提供对 bean 的检索,看看是否在 IOC 容器有这个名字的 bean

http://boolean containsBean(String name);

//根据 bean 名字得到 bean 实例,并同时判断这个 bean 是不是单例

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

boolean isTypeMatch(String name, ResolvableType typeToMatch) throws

NoSuchBeanDefinitionException;

boolean isTypeMatch(String name, @Nullable Class> typeToMatch) throws

NoSuchBeanDefinitionException;

//得到 bean 实例的 Class 类型

@Nullable

Class> getType(String name) throws NoSuchBeanDefinitionException;

//得到 bean 的别名,如果根据别名检索,那么其原名也会被检索出来

String[] getAliases(String name);

}

二、BeanDefinition

SpringIOC 容器管理了我们定义的各种 Bean 对象及其相互的关系,Bean 对象在 Spring 实现中是

以 BeanDefinition 来描述的。

三、BeanDefinitionReader

Bean 的解析主要就是对 Spring 配置文件的解析。这个解析过程主要通过

BeanDefintionReader 来完成。

四、Web IOC 容器初体验

IOC 容器初始化以后,最后调用了DispatcherServlet 的 onRefresh()方法,在 onRefresh()方法中又是直接调用 initStrategies()方法初始化 SpringMVC 的九大组件:

/**

* This implementation calls {@link #initStrategies}.

*/

@Override

protected void onRefresh(ApplicationContext context) {

initStrategies(context);

}

/**

* Initialize the strategy objects that this servlet uses.

*

May be overridden in subclasses in order to initialize further strategy objects.

*/

//初始化策略

protected void initStrategies(ApplicationContext context) {

//多文件上传的组件

initMultipartResolver(context);

//初始化本地语言环境

initLocaleResolver(context);

//初始化模板处理器

initThemeResolver(context);

//handlerMapping

initHandlerMappings(context);

//初始化参数适配器

initHandlerAdapters(context);

//初始化异常拦截器

initHandlerExceptionResolvers(context);

//初始化视图预处理器

initRequestToViewNameTranslator(context);

//初始化视图转换器

initViewResolvers(context);

//

initFlashMapManager(context);

}

IOC 容器初始化小结:

现在通过上面的代码,总结一下 IOC 容器初始化的基本步骤:

1. 初始化的入口在容器中的refresh 调用来完成。

2. 对Bean 定义载入IOC 容器使用的方法是loadBeanDefinition 。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 中的伪共享详解及解决方案
下一篇:浅谈JAVA 内存流的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~