详解Spring框架的核心思想之IOC

发布时间:2020-06-21 00:06:52 作者:GitShare
来源:网络 阅读:1486

微信号:GitShare
微信公众号:爱折腾的稻草
如有问题或建议,请在公众号留言[1]

前续

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

No.1 Spring是什么

为了让更多的朋友了解Spring,首先科普一下Spring!有兴趣的朋友可以去Spring官网逛逛,地址是:https://spring.io/

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

Spring Framework为现代基于Java的企业应用程序提供了全面的编程和配置模型 - 在任何类型的部署平台上。

总的来说:Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。

No.2 Spring的优点

Spring的一个关键要素是应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级业务逻辑,而无需与特定部署环境建立不必要的联系。

No.3 Sprnig的架构
详解Spring框架的核心思想之IOC

整个Spring框架按其所属功能可以划分为五个主要模块,这五个模块几乎为企业应用提供了所需的一切,从持久层、业务层到表现层都拥有相应的支持,这就是Spring为什么是一站式框架。IoC和AOP是Spring的核心。

1、核心模块(Core Container)
2、AOP模块

Spring AOP模块提供了满足AOP Alliance规范的实现,还整合了AspectJ这种AOP语言级的框架。通过AOP能降低耦合。

3、数据访问集成模块(Data Access/Integration )

该模块包括了JDBC、ORM、OXM、JMS和事务管理

4、Web模块

该模块建立在ApplicationContext模块之上,提供了Web应用的功能。如文件上传、FreeMarker等。
Spring可以整合Struts2等MVC框架。Spring自己提供了MVC框架Spring MVC。

5、测试模块

Spring可以用非容器依赖的编程方式进行几乎所有的测试工作,支持JUnit和TestNG等测试框架。

No.4 什么是IOC

IOC是Inversion of Control的缩写,也称为“控制反转”。1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。  
简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。  
IOC理论提出的观点大体是这样的:借助于“第三方”(IOC容器)实现具有依赖关系的对象之间的解耦。

2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。
控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。  
依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

小结:
No.5 Spring的IOC容器(BeanFaoctory体系)

BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,其源码如下:

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<T> requiredType) throws BeansException;
    /**
     * 根据bean的名字和Class类型来得到bean实例,args实例化bean时的参数
     */

    Object getBean(String name, Object... args) throws BeansException;
    /**
     * 根据bean的Class类型类获取bean实例
     */

    <T> getBean(Class<T> requiredType) throws BeansException;
    /**
     * 根据bean的Class类型类获取bean实例,args实例化bean时的参数
     */

    <T> getBean(Class<T> requiredType, Object... args) throws BeansException;
    /**
     * 提供对bean的检索,看看是否在IOC容器有这个名字的bean 
     */

    boolean containsBean(String name);
    /**
     * 根据bean名字得到bean实例,并同时判断这个bean是不是单例 
     */

    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    /**
     * [2.0.3新增]根据bean名字得到bean实例,并同时判断这个bean是不是原型
     */

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    /**
     * 检查给定名称的getBean调用是否将返回可分配给指定目标类型的对象。
     */

    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    /**
     * [2.0.1版本新增]检查给定名称的getBean调用是否将返回可分配给指定目标类型的对象。 
     */

    boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    /**
     * 得到bean实例的Class类型  
     */

    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    /**
     * 得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
     */

    String[] getAliases(String name);
}

用于访问Spring bean容器的根接口。  
BeanFactory实现应尽可能支持标准bean生命周期接口,完整的初始化方法及其标准顺序是:

1、BeanNameAware的setBeanName
2、BeanClassLoaderAware的setBeanClassLoader
3、BeanFactoryAware的setBeanFactory
4、EnvironmentAware的setEnvironment
5、EmbeddedValueResolverAware的setEmbeddedValueResolver
6、ResourceLoaderAware的setResourceLoader(仅适用与运行时的应用上下文) 
7、ApplicationEventPublisherAware的setApplicationEventPublisher (仅适用与运行时的应用上下文) 
8、MessageSourceAware的setMessageSource (仅适用与运行时的应用上下文) 
9、ApplicationContextAware的setApplicationContext (仅适用与运行时的应用上下文) 
10、ServletContextAware'的setServletContext (仅适用与运行时的应用上下文) 
- 11、 BeanPostProcessors的postProcessBeforeInitialization方法
- 12、InitializingBean的afterPropertiesSet
- 13、自定义一个初始化方法(init-method)
- 14、BeanPostProcessors的postProcessAfterInitialization方法

关闭BeanFactory时,以下生命周期方法适用:

1、DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法
2、DisposableBean's destroy 
- 3、自定义一个销毁方法(destroy-method)
1、BeanFactory的继承关系
详解Spring框架的核心思想之IOC
public interface HierarchicalBeanFactory extends BeanFactory {
    /**
     * 返回其父工厂,如果没有返回Null
     */

    @Nullable
    BeanFactory getParentBeanFactory();
    /**
     * 返回当前bean工厂上下文是否存在给定bean名字的bean,忽略定义在其继承层次中的工厂上下文,只在当前层次中查找
     */

    boolean containsLocalBean(String name);

}
2、Spring中IOC容器的初始化

在Spring中IOC容器的初始化是有refresh()方法来启动的,主要有三个基本过程:

No.6 IOC容器的缺点

IOC给我们带来的优点就不说了,主要看看其注意事项:

后记

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

本系列历史文章列表

详解Spring框架的核心思想之IOC


推荐阅读:
  1. Spring 框架基础(03):核心思想 IOC 说明,案例演示
  2. Spring框架和IOC容器是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring springboot

上一篇:TD8.0使用mail direct配置邮件服务

下一篇:SQL多个主键的表,插入数据有重复时,查询数据的重复值?

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》