学习Spring,专门开设一门专栏,在学习的过程中,坚持做笔记,了解Spring各个模块中的原理以及思想。夯实基础!坚持坚持坚持!

什么是Spring Framework?(沙雕面试题)

Spring 是一种易用性的,它可以使你的应用变得开发的更容易,它提供任何你想要的东西,并且是拥抱在企业环境的Java语言上面,并且支持运行在JVM上的第二语言或者可选语言,比如Groovy、Kotlin这样的语言,同时根据你软件的需要也提供一些弹性为你创造出不同的一个软件架构。

Spring Framework 有哪些核心模块?(996面试题)

  • spring-core:Spring 基础 API模块,如资源管理,泛型管理。

  • spring-beans: Spring Bean 相关,如依赖查找、依赖注入。

  • spring-aop: Spring AOP 处理,如动态代理,AOP 字节码提升。

  • spring-context: 事件驱动、注解驱动、模块驱动。

  • spring-expression: Spring表达式语言模块。

什么是IOC ?(沙雕面试题)

简单的说IOC是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入两种实现方式。按照IOC的定义,很多方面都是IOC,比如JavaBeans是IOC的一个容器实现,Servlet的容器也是IOC的实现,因为Servlet可以去依赖或者反向地通过JNDI的方式进行得到一些外部的资源,包括DataSource或者相关的EJB组件,与此同时,像Spring Framework或者Peak Container的依赖注入的框架也能够帮我们实现我们的IOC,这些东西都是我们常见的一个IOC实现策略,按照这个定义,如果是反转控制,包括我们所说的消息其实也算,因为消息是被动的,如果说传统的调用链路,是一个主动拉的模式,那么IOC是被动推的模式,那么推的模式在消息时间以及各种这样类似于这种反向的观察者模式的扩展都属于IOC。

依赖查找和依赖注入的区别?(996面试题)

依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准API实现。比如说Servlet的API,JNDI的API,EJB的API,这种方式是一种显现的,一种调用API的方式去获取你想要的资源。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和API,比如现在Spring容器或者EJB容器,它已经能够做到不需要依赖外部这些API就能够实现注入,当然需要一些潜在的规则。依赖查找通常来说比依赖注入的步骤稍微多一点,因为最关心的是一个依赖的本身,所以我们从代码的便利性来说,依赖注入比依赖查找更与便利,依赖的API或者资源也会更少一点,至少少一个API的约束。

Spring 作为IOC容器有什么优势?(劝退面试题)

  • 典型的IOC管理,依赖查找和依赖注入

从功利角度来将,依赖注入比依赖查找更便利,但是两者的特性其实在本质上的区别,尽管依赖注入的方式在Spring场景里面,比依赖查找会更多的一些来源,但是在底层的实现上是如出一辙的,最重要的是这个数据的来源是怎么样的以及它初始化相关的生命周期是怎么样去管理的。

  • AOP抽象

与OOP对比,AOP是处理一些横切行问题。这些横切性问题不会影响到主逻辑的实现,但是会散落到代码的各个部分,难以维护。AOP就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。

  • 事务抽象

事务分为很多种级别或者是很多种我们所传播的事务的一个模式,那么这个模式在Spring抽象里面其实做的非常到位,它其实是对我们的这些JavaEE传统的东西做了一层封装。

  • 事件机制

基于Java的标准事件,包括EventObject以及EventListener这两个接口来进行操作,其中EventObject是一个抽象类,EventListener是一个接口,接口就是一个标记接口,就说凡是如果是事件监听,那么就是对EventListener接口进行扩展,包括Spring里面的ApplicationListener接口。

  • SPI扩展

传统的包括BeanPostProcessor,我们说Bean的扩展BeanFactoryPostProcessor就说IOC容器的一个扩展,就是BeanFactory的一个扩展。当然还有其他的扩展方式,比如工厂扩展机制,比如说它里面有Spring Factories,那么一个API帮助类,虽然是在Spring提出来的,但是在SpringBoot里运用的比较多,有个自动配置功能,就是在自动装配的时候经常会用到。

  • 强大的第三方整合

与非常多的第三方应用进行整合,比如ORM或者一些JDBC,还有一些关于消息方面的,中间件的整合,整个整合都是通过自己的API来完成的。还有一些数据操作方面的整合,比如SpringData,它封装了一些关系型数据库常用的东西,比如说CRUD,那么它通过一些契约的方式动态生成或者反向生成一些中间代码,帮助我们去调用一些数据库操作,或者非关系型数据库的操作等。

  • 易测试性

Spring提出一个很好的议题,就是任何东西都是可以测试的。测试性方面Spring也做的非常好,Spring在它的一个模块Spring-test提出一些新的东西,包括集成测试和单元测试,单元测试在web场景和非web场景都提供了模拟对象,所谓的Mock Object,能够帮我们去测试一些复杂的结构。比如说ServletRequest或者ServletContext接口,来在web场景帮助我们测试。

  • 更好的面向对象

Spring 其实把面向对象运用到非常极致的地步,里面有非常多的设计模式的体现,比如代理模式、适配器模式、工厂模式、单例模式、观察者模式等等,这些设计模式都是很好的面向对象的实现。那么在API设计层面,也考虑到了流行的方法。