1、Spring
答:Spring
总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被分别整合在核心容器(Core Container)
、 AOP(Aspect Oriented Programming)
和设备支持(Instrmentation)
、数据访问与集成(Data Access/Integeration)
、Web
、 消息(Messaging)
、Test
等 6 个模块中。 以下是 Spring 5
的模块结构图:
spring core
: 提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)
和依赖注入(Dependency Injection,DI)
功能;spring beans
: 提供了BeanFactory
,是工厂模式的一个经典实现,Spring
将管理对象称为Bean
;spring context
: 构建于core
封装包基础上的context
封装包,提供了一种框架式的对象访问方法;spring jdbc
: 提供了一个JDBC
的抽象层,消除了烦琐的JDBC
编码和数据库厂商特有的错误代码解析, 用于简化JDBC
;spring aop
: 提供了面向切面的编程实现,让你可以自定义拦截器、切点等;spring Web
: 提供了针对Web
开发的集成特性,例如文件上传,利用servlet listeners
进行IOC
容器初始化和针对Web
的ApplicationContext
。spring test
: 主要为测试提供支持的,支持使用JUnit
或TestNG
对Spring组件进行单元测试和集成测试。
2、Spring
框架中都用到了哪些设计模式?
- 工厂模式:
Spring IOC
核心的设计模式的思想体现就是工厂模式,他自己这个IOC
容器就是一个大的工厂,把所有的Bean
实例都给放在了Spring
容器里,如果你要使用Bean
,就找Spring
容器就可以了,自己不用创建对象了; - 单例模式:
Spring
中的Bean
默认作用域就是singleton
都是单例的; - 代理模式:
Spring AOP
功能的实现就用到了代理模式,Spring AOP
生成一些代理对象,做一定的增强,然后我们对目标对象的访问就是基于这个代理对象去访问。Spring
的AOP
功能用到了JDK
的动态代理和CGLIB
字节码生成技术; - 模板方法: 用来解决代码重复问题。
Spring
中的jdbcTemplate
、hibernateTemplate
等以Template
结尾的对数据库操作的类,它们就使用到了模板模式; - 观察者模式: 定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如
Spring
中listener
的实现ApplicationListener
; - 适配器模式:
Spring AOP
的增强或通知(Advice)
使用到了适配器模式、Spring MVC
中也是用到了适配器模式适配Controller
。
3、Spring
的核心容器(Spring Context
应用上下文)模块
答:Bean
工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory
,它根据 XML
文件中的定义加载 Beans
。该容器从XML
文件读取配置元数据并用它去创建一个完全配置的系统或应用。
- 简单点理解,就是将需要
Spring IOC
容器帮我们管理的对象(Spring
中我们称对象为Bean
)和Bean
与Bean
之间的协作关系,是基于xml
或Java
注解的形式配置好,然后通过Spring应用上下文将其加载进Spring IOC
容器中,这样容器就能给我们提供我们想要的对象管理服务。 - 通俗点理解,就是我们需要一个对象,来将
Spring
配置文件中配置好的Bean
关系,加载到Spring IOC
容器中,而Spring
应用上下文就充当了这样的角色。 - 所以我们可以说
Spring
上下文,就是将需要Spring
帮我们管理的对象加载到Spring IOC
容器中的一种容器对象。
4、Spring
框架中有哪些不同类型的事件?
- 上下文更新事件(
ContextRefreshedEvent
): 在调用ConfigurableApplicationContext
接口中的refresh()
方法时被触发。 - 上下文开始事件(
ContextStartedEvent
): 当容器调用ConfigurableApplicationContext
的Start()
方法开始/重新开始容器时触发该事件。 - 上下文停止事件(
ContextStoppedEvent
): 当容器调用ConfigurableApplicationContext
的Stop()
方法停止容器时触发该事件。 - 上下文关闭事件(
ContextClosedEvent
): 当ApplicationContext
被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean
都被销毁。 - 请求处理事件(
RequestHandledEvent
): 在Web
应用中,当一个Http请求(request)
结束触发该事件。如果一个bean
实现了ApplicationListener
接口,当一个ApplicationEvent
被发布以后Bean
会自动被通知。
5、Spring
应用程序有哪些不同组件?
- 接口: 定义功能。
Bean
类: 它包含属性,setter
和getter
方法,函数等。Bean
配置文件: 包含类的信息以及如何配置它们。Spring
面向切面编程(AOP
): 提供面向切面编程的功能。- 用户程序: 它使用接口。