spring面试专题

tech2022-09-12  115

springMVC的九大组件

1、MultipartResolver(文件处理器),对应的初始化方法是initMultipartResolver(context),用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File。

2、LocaleResolver(当前环境处理器),对应的初始化方法是initLocaleResolver(context),这就相当于配置数据库的方言一样,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。

3、ThemeResolver(主题处理器),对应的初始化方法是initThemeResolver(context),用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源,如图片、css样式等。SpringMVC的主题也支持国际化。

4、HandlerMappings(处理器映射器),对应的初始化方法是initHandlerMappings(context),这就是根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理呢

5、HandlerAdapters(处理器适配器),对应的初始化方法是initHandlerAdapters(context),从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapters要做的事情。

6、HandlerExceptionResolvers(异常处理器),对应的初始化方法是initHandlerExceptionResolvers(context),其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?这就要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。

7、RequestToViewNameTranslator(视图名称翻译器),对应的初始化方法是initRequestToViewNameTranslator(context),有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。

8、ViewResolvers(页面渲染处理器),对应的初始化方法是initViewResolvers(context),ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。

9、FlashMapManager(参数传递管理器),对应的初始化方法是initFlashMapManager(context),用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。

什么是spring?Spring 框架有哪些主要模块?

Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。 Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不必担心 Spring 是如何在后台进行工作的。 Spring 框架至今已集成了 20 多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集 成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

什么是控制反转(IOC),什么是依赖注入(DI)?

控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业 务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配 器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。 控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。 依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件? 在 Java 中依然注入有以下三种实现方式:

构造器注入Setter 方法注入接口注入

请解释一下Spring框架中的IOC?

Spring 中的 org.springframework.beans 包和 org.springframework.contex包 构成了 Spring 框架 IoC 容器的基础。 BeanFactory 接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。 ApplicationContex 接口对 BeanFactory(是一个子接口)进行了扩展,在 BeanFactory 的基础上添加了其他功能,比如与 Spring 的 AOP 更容易集成,也提供了处理 message resource的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对 Web 应用的WebApplicationContext。 org.springframework.beans.factory.BeanFactory 是 Spring IoC 容器的具体实现,用来包装和管理前面提到的各种 bean。BeanFactory 接口是 Spring IoC 容器的核心接口。 IOC:把对象的创建、初始化、销毁交给 spring 来管理,而不是由开发者控制,实现控制反转。

BeanFactory 和 ApplicationContext 有什么区别?

BeanFactory: BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义,以便在接收到客户端请求时将对应的 bean 实例化。 BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 bean 自身与 bean 客户端的配置中解放出来。BeanFactory 还包含 了 bean 生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。 ApplicationContext 关于ApplicationContext是继承自BeanFactory接口的,它是Spring的高级容器,提供了更多有用的功能: 1)国际化(MessageSource) 2) 访问资源,如URL和文件(ResourceLoader) 3) 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层 4)消息发送,响应机制(ApplicationEventPublisher) 5)AOP(拦截器)

两者装载Bean的区别 BeanFactory: BeanFactory在启动的时候不会去实例化Bean,当从容器中去拿Bean的时候才会去实例化; ApplicationContext: ApplicationContext在启动的时候就把所有的Bean全部实例化了。当然了ApplicationContext也可以通过设置lazy-init=true来让Bean实现延迟实例化。

总而言之,BeanFactory是懒加载的,而ApplicationContext默认是实时加载,但是也可以通过设置属性为懒加载。

延迟实例化的优点 应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势; 不延迟实例化的优点

所有的Bean在启动的时候都加载,系统运行的速度快;在启动的时候所有的Bean都加载了,我们就能在系统启动的时候,尽早的发现系统中的配置问题 、建议web应用,在启动的时候就把所有的Bean都加载了。(把费时的操作放到系统启动中完成)

SpringBean的生命周期

SpringBean的生命周期简单易懂。在一个Bean实例被初始化的时候,需要执行一系列的初始化操作达到可用的状态。同样的,当一个Bean不再被调用的时候需要进行相关的析构操作,并且从bean容器中移除。 SpringFactory负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两种回调(call back)方法组成。

初始化之后调用的回调方法。销毁之前调用的回调方法。 Spring 框架提供了以下四种方式来管理 bean 的生命周期事件: InitializingBean 和 DisposableBean 回调接口针对特殊行为的其他 Aware 接口Bean 配置文件中的 Custom init()方法和 destroy()方法@PostConstruct 和@PreDestroy 注解方式

Spring Bean 的作用域之间有什么区别?

Spring 容器中的 bean 可以分为 5 个范围。所有范围的名称都是自说明的,但是为了避免混淆,还 是让我们来解释一下:

singleton:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个 bean 的实例,单例的模式由 bean factory 自身来维护。prototype:原形范围与单例范围相反,为每一个 bean 请求提供一个实例。request:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后, bean 会失效并被垃圾回收器回收。Session:与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean 会随之失效。global- session:global-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器中工作 时,它包含很多 portlet。如果 你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全 局变量需要存储在 global-session 中。 全局作用域与 Servlet 中的 session 作用域效果相同。
最新回复(0)