1、什么是 Spring 框架?Spring 框架有那些主要的模块
Spring 是一个轻量级的JavaEE框架,它主要解决企业应用中的复杂性问题。
Spring 框架有三个核心部分:IOC(控制反转)容器,AOP(面向切面编程)和数据访问/集成层。
Spring 中的IoC容器提供了一种对象创建和对象之间关系管理的机制,以实现松散耦合和可扩展性。AOP提供了一种很好的方式来实现横向关注点的处理,如事务处理,安全检查,缓存等。数据访问/集成层则提供了许多针对不同数据持久化技术的实现,比如JDBC、ORM和NoSQL。
Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成、Web、AOP、工具、消息和测试模块。

除上述内容之外,希望大家对于Spring能有一个更加广义的理解,这里大家记住两个名词:生态和基石。
2、Spring 有哪些优点?
轻量级:Spring 在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。
控制反转(IOC):Spring 使用控制反转技术实现松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。
面向切面编程(AOP):Spring 支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。
扩展性:后续使用的SpringBoot或者SpringCloud等相关的技术都是在Spring的基础上扩展来的,也就是说Spring能够经久不衰,最关键的点就是在于它的扩展性。
容器:Spring 包含并管理应用程序对象的配置及生命周期。
MVC框架:Spring的Web框架是一个设计优良的Web MVC框架,很好的取代了一些Web框架。
事务管理:Spring 对下至本地业务,上至全局业务(JAT)提供了统一的事务管理接口。
异常处理:Spring 提供一个方便的API将特定技术的异常(有JDBC、Hibernate、或JDO抛出)转化为一致的、Unchecked异常。
3、什么是控制反转(IOC)?什么是依赖注入?
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的,在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种给予应用程序中目标组件更多控制为目的的设计范式,并在我们实际工作中起到了有效的作用。
依赖注入是在编程阶段尚未知所需的功能是来自哪个类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
在Java中依赖注入有以下三种实现方式:
1、构造器注入
2、Setter 方法注入
3、接口注入
4、谈一下你对SpringIOC的理解?
Spring的IOC,即Inversion of Control,也就是控制反转,是Spring框架的核心特性之一。其主要思想是将原本在代码中直接操控的对象的调用权交给Spring容器来管理,从而降低了代码之间的耦合度,提高了程序的可维护和可扩展性。
在传统的Java开发中,我们通常在代码中直接new一个对象来调用其方法。但这种方式会导致代码之间的耦合度过高,一旦某个类发生改变,可能会影响到很多其他的类,而Spring的IOC解决了这个问题,它将对象的创建和生命周期管理交给了Spring容器来负责,我们只需要在配置文件中配置好相应的Bean,然后就可以在需要的地方通过Spring容器来获取这个Bean,而不需要关心它的创建和销毁过程。
整个IOC容器创建的流程和步骤如下:
1、一般聊IOC容器的时候要涉及到容器的创建过程(beanFactory.DefaultListableBeanFactory),向bean工厂中设置一些参数(BeanPostProcessor.Aware接口的子类)等等属性。
2、加载解析bean对象,准备要创建的bean对象的定义对象beanDefinition,(xml或者注解的解析过程)
3、beanFactoryPostProcessor的处理,此处是扩展点,PlaceHolderConfigurSupport,ConfigurationClassPostProcessor
4、BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能
5、通过反射的方式将BeanDefinition对象实例化成具体的bean对象
6、bean对象的初始化过程(填充属性,调用aware子类的方法,调用BeanPostProcessor前置处理方法,调用init-mehtod方法,调用BeanPostProccessor的后置处理方法)
7、生成完整的bean对象,通过getBean方法可以直接获取
8、销毁过程
5、描述一下bean的生命周期

1、实例化bean:反射的方式生成对象
2、填充bean属性:populateBean() 循环依赖的问题(三级缓存)
3、调用aware接口相关的方法:InvokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)
4、调用BeanPostProcessor中的前置处理方法:使用比较多的有(ApplicationContextPostProcessor,设置ApplicationContext,Environment,ResourceLoader,EmbeddValueResolver等对象)
5、调用initmethod方法:invokeInitmethod(),判断是否实现了initializiangBean接口,如果有,调用afterPropertiesSet方法,没有就不调用
6、调用BeanPostProcessor的后置处理方法:Spring的AOP就是在此处实现的,AbstractAutoProxyCreator 注册Destuction相关的回调接口:钩子函数
7、获取到完整的对象,可通过getBean的方式来进行对象的获取
8、销毁流程:1:判断该是否实现了DispoableBean接口,2:调用destroyMethod方法