Spring

什么是Spring的依赖注入(DI)?IOC和DI的区别是什么

很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点,IOC和DI是从不同的

角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,IOC是依赖倒置原则的设计思想,而

DI是具体的实现方式

在面向对象设计的软件系统中,底层的实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻

辑。

![image-20210921210458419](/Users/chentao/Library/Application Support/typora-user-images/image-20210921210458419.png)

有一个对象出了问题,就可能会影响到整个流程的正常运转。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越

复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高

的系统,必然会出现牵一发而动全身的情形。

![image-20210921210530263](/Users/chentao/Library/Application Support/typora-user-images/image-20210921210530263.png)

大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,对象和对象之间没有了耦合关系, 它起到了一种

类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此

失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来

紧耦合和松耦合有什么区别?

紧耦合:

紧密耦合是指类之间高度依赖。

松耦合:

松耦合是通过促进单一职责和关注点分离、依赖倒置的设计原则来实现的。

BeanFactory的作用

BeanFactory是Spring中非常核心的一个顶层接口

它是Bean的“工厂”、它的主要职责就是生产Bean

它实现了简单工厂的设计模式,通过调用getBean传入标识生产一个Bean;

它有非常多的实现类、每个工厂都有不同的职责(单一职责)功能,最强大的工厂是:DefaultListableBeanFactory

Spring底层就是使用的该实现工厂进行生产Bean的

BeanFactory它也是容器 Spring容器(管理着Bean的生命周期)

![image-20210921211150004](/Users/chentao/Library/Application Support/typora-user-images/image-20210921211150004.png)

BeanDefinition的作用

它主要负责存储Bean的定义信息:决定Bean的生产方式。

如:spring.xml

<bean class="com.ct.User" id="user" scope="singleton" lazy="false" abstract="false" autowire="none" ....>

<property name="username" value="chentao">` 

</bean>

后续BeanFactory根据这些信息就行生产Bean: 比如实例化 可以通过class进行反射进而得到实例对象 , 比如lazy 则不会在ioc加载时

创建Bean

BeanFactory 和 ApplicationContext有什么区别?

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是

BeanFactory的子接口。

依赖关系

BeanFactory:是Spring里面最顶层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例

化,控制bean的生命周期,维护bean之间的依赖关系。BeanFactory 简单粗暴,可以理解为就是个 HashMap,Key 是

BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容

器”

ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具

备了更多的功能。例如资源的获取,支持多种消息(例如 JSP tag 的支持),对 BeanFactory 多了工具级别的支持等

待。所以你看他的名字,已经不是 BeanFactory 之类的工厂了,而是 “应用上下文”, 代表着整个大容器的所有功

能。该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新

加载/刷新所有的 bean。

ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功

能:

![image-20210921211627621](/Users/chentao/Library/Application Support/typora-user-images/image-20210921211627621.png)

上一篇:2021年Java技术下半场在哪,面试阿里巴巴


下一篇:浅谈IOC--说清楚IOC是什么(转)