一、Spring

1、Spring中都用到了哪些设计模式?

(1)工厂模式:比如通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象
(2)代理模式:AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理
(3)单例模式:Spring 中的 Bean 默认都是单例的
(4)模板方法模式:Spring 中 jdbcTemplate 等以 Template 结尾的对数据库操作的类,都会使用到模板方法设计模式,一些通用的功能
(5)包装器模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库,这种模式让我们可以根据客户的需求能够动态切换不同的数据源
(6)观察者模式:Spring 事件驱动模型观察者模式的
(7)适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式

2、Spring中有哪些核心模块?

image.png
(1)Spring Core:Spring核心,框架最基础的部分,提供IOC和依赖注入DI特性
(2)Spring Context:Spring上下文容器,它是 BeanFactory 功能加强的一个子接口
(3)Spring Web:提供Web应用开发的支持
(4)Spring MVC:针对Web应用中MVC思想的实现
(5)Spring DAO:提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性
(6)Spring ORM:支持用于流行的ORM框架的整合
(7)Spring AOP:即面向切面编程,提供了与AOP联盟兼容的编程实现

3、说一下你理解的 IOC 是什么?

IOC 是一个「容器」,用来装载对象的,核心思想就是「控制反转」。
控制反转就是「把对象的控制权交给了Spring,由Spring容器进行管理」。
为什么需要IOC?如果没有控制反转,我们需要「自己去创建对象,配置对象」,还要「人工去处理对象与对象之间的各种复杂的依赖关系」,当一个工程的量起来之后,这种关系的维护是非常令人头痛的,所以就有了控制反转这个概念,将对象的创建、配置等一系列操作交给 spring 去管理,我们在使用的时候只要去取就好了。

4、Spring中的IOC容器有哪些?有什么区别?

一种是 「BeanFactory」,还有一种是 「ApplicationContext」。
区别:BeanFactory 只提供了最基本的实例化对象和拿对象的功能,而 ApplicationContext 继承了 BeanFactory ,它的作用更加的强大,比如支持注解注入、国际化等功能。

5、@Repository、@Service、@Compent、@Controller它们有什么区别?

本质是一样的,都是将被该注解标识的对象放入Spring容器当中,只是为了在使用上区分不同的应用分层
@Repository:dao层
@Service:service层
@Controller:controller层
@Compent:其他不属于以上三层的统一使用该注解

6、说说AOP是什么?

面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

7、动态代理和静态代理有什么区别?

(1)静态代理
①由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了
②静态代理通常只代理一个类
③静态代理事先知道要代理的是什么
(2)动态代理
①在程序运行时,运用反射机制动态创建而成
②动态代理是代理一个接口下的多个实现类
③动态代理不知道要代理什么东西,只有在运行时才知道

8、JDK 动态代理和 CGLIB 代理有什么区别?

(1)JDK 动态代理时业务类「必须要实现某个接口」,它是「基于反射的机制实现的」,生成一个实现同样接口的一个代理类,然后通过重写方法的方式,实现对代码的增强。
(2)CGLIB 动态代理是使用字节码处理框架 ASM,其原理是通过字节码技术「为一个类创建子类,然后重写父类的方法」,实现对代码的增强。

9、Spring中Bean的生命周期?

image.png

10、Spring是怎么解决循环依赖的?

(1)循环依赖
两个对象相互依赖,形成了一个环形的调用链路
image.png
(2)解决
使用三级缓存,原理是把实例化和初始化的步骤分开,然后放入缓存中,供另一个对象调用。
「第一级缓存」:用来保存实例化、初始化都完成的对象
「第二级缓存」:用来保存实例化完成,但是未初始化完成的对象
「第三级缓存」:用来保存一个对象工厂,提供一个匿名内部类,用于创建二级缓存中的对象

11、@Autowired 和 @Resource 有什么区别?

(1)「@Resource 是 Java 的注解」,@Resource 有两个属性 name 和 type;Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
(2)「@Autowired 是 Spring 的注解」,是 Spring2.5 版本引入的,Autowired 只根据 type 进行注入,不会去匹配 name。


二、MyBatis


三、SpringMVC


四、SpringBoot

1、SpringBoot自动装配原理?

(1)容器在启动的时候会调用 EnableAutoConfigurationImportSelector.class 的 selectImports 方法获取一个全面的常用 BeanConfiguration 列表
(2)读取 spring-boot-autoconfigure.jar 下面的 spring.factories,获取到所有的 Spring 相关的 Bean 的全限定类名 ClassName
(3)调用 filter 来一一筛选,过滤掉一些我们不需要不符合条件的 Bean
(4)把符合条件的 BeanConfiguration 注入默认的 EnableConfigurationPropertie 类里面的属性值,并且注入到 IOC 环境当中