什么是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)