SpringMVC详细介绍,充分了解Spring

1. Spring 的 的 IOC 和 和 AOP 机制?

IOC:控制反转也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在 spring 配置
文件总配置相应的 bean,以及设置相关的属性,让 spring 容器来生成类的实例对象以及管
理对象。在 spring 容器启动的时候,spring 会把你在配置文件中配置的 bean 都初始化好,
然后在你需要调用的时候,就把它已经初始化好的那些 bean 分配给你需要调用这些 bean
的类(假设这个类名是 A),分配的方法就是调用 A 的 setter 方法来注入,而不需要你在 A
里面 new 这些 bean 了。
AOP:面向切面编程。(Aspect-Oriented Programming)
AOP 可以说是对 OOP 的补充和完善。OOP 引入封装、继承和多态性等概念来建立一种对象
层次结构,
实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该
消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创
建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.

2. Autowired 和 和 Resource 关键字的区别?

@Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是 Spring 的注解,
它的包是 javax.annotation.Resource,需要导入,但是 Spring 支持该注解的注入。
1、共同点
两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方
法。
2、不同点
(1)@Autowired
@Autowired 为 Spring 提 供 的 注 解 , 需 要 导 入 包
org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入。
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存
在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)
来装配,可以结合@ ## ualifier 注解一起使用。
(2)@Resource
@Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包 javax.annotation.Resource。
@Resource 有两个重要的属性:name 和 type,而 Spring 将@Resource 注解的 name 属性解
析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使
用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不制
定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

3. 依赖注入的方式有几种,各是什么?

一、构造器注入
二、setter 方法注入
三、接口注入

4. 讲一下什么是 Spring

Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框
架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常 的配置
方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
主要由以下几个模块组成:
Spring Core:核心类库,提供 IOC 服务;
Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP 服务;
Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的 ORM 框架的支持;
Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。

5. Spring MVC 流程

1、 用戶发送请求至前端控制器 DispatcherServlet。
2、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象
及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
4、 DispatcherServlet 调用 HandlerAdapter 处理器适配器。
5、 HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller 执行完成返回 ModelAndView。
7、 HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。
8、 DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
9、 ViewReslover 解析后返回具体 View。
10、DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet 响应用戶。

6. spring 组件说明

以下组件通常使用框架提供实现:
DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,
降低组件之间的耦合性,提高每个组件的扩展性。
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现
接口方式,注解方式等。
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、
pdf、excel 等。
组件:
1、前端控制器 DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了 dispatcherServlet 减少了其
它组件之间的耦合度。
用戶请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制
的中心,由它调用其它组件处理用戶的请求,dispatcherServlet 的存在降低了组件之间的耦
合性。
2、处理器映射器 HandlerMapping(不需要工程师开发),由框架提供作用:根据请求的 url 查
找 Handler
HandlerMapping 负责根据用戶请求找到 Handler 即处理器,springmvc 提供了不同的映射器
实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器 HandlerAdapter
作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更
多类型的处理器进行执行。
4、处理器 Handler(需要工程师开发)
注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行
Handler
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下
Handler 对
具体的用戶请求进行处理。
由于 Handler 涉及到具体的用戶业务请求,所以一般情况需要工程师根据业务需求开发
Handler。
5、视图解析器 View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物
理视图名即具体的 面地址,再生成View视图对象,最后对View进行渲染将处理结果通过 面
展示给用戶。springmvc 框架提供了很多的 View 视图类型,包括:jstlView、freemarkerView、
pdfView 等。
一般情况下需要通过 面标签或 面模版技术将模型数据通过 面展示给用戶,需要由工程师
根据业务需求开发具体的 面。
6、视图 View(需要工程师开发 jsp…)
View 是一个接口,实现类支持不同的 View 类型(jsp、freemarker、pdf…)

7. 什么是 spring mvc

在讲 SpringMVC 之前我们先来看一下什么是 MVC 模式 MVC:MVC 是一种设计模式 MVC 的
原理图:
分析:
M-Model 模型(完成业务逻辑:有 javaBean 构成,service+dao+entity)
V-View 视图(做界面的展示 jsp,html……)
C-Controller 控制器(接收请求—>调用模型—>根据结果派发 面)
springMVC 是什么:
  springMVC 是一个 MVC 的开源框架,springMVC=struts2+spring,springMVC 就相当于是
Struts2 加上 sring 的整合,但是这里有一个疑惑就是,springMVC 和 spring 是什么样的关系
呢?这个在百度百科上有一个很好的解释:意思是说,springMVC 是 spring 的一个后续产品,
其实就是 spring 在原有基础上,又提供了 web 应用的 MVC 模块,可以简单的把 springMVC
理解为是 spring 的一个模块(类似 AOP,IOC 这样的模块),网络上经常会说 springMVC 和
spring 无缝集成,其实 springMVC 就是 spring 的一个子模块,所以根本不需要同 spring 进行
整合。

8. SpringMVC 怎么样设定重定向和转发的?

(1)转发:在返回值前面加 forward: ,譬如 forward:user.do?name=method4
(2)重定向:在返回值前面加 redirect: ,譬如 redirect:http://www.baidu.com"

9. SpringMVC 常用的注解有哪些?

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示
类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。
@ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客戶。

10. Spring 的 的 AOP 理解

OOP 面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代
码的重复,而不利于各个模块的重用。
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个
对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切
面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护
性。可用于权限认证、日志、事务处理。
AOP 实现的关键在于 代理模式,AOP 代理主要分为静态代理和动态代理。静态代理的代表
为 AspectJ;动态代理则以 Spring AOP 为代表。
(1)AspectJ 是静态代理的增强,所谓静态代理,就是 AOP 框架会在编译阶段生成 AOP 代
理类,因此也称为编译时增强,他会在编译阶段将 AspectJ(切面)织入到 Java 字节码中,运
行的时候就是增强之后的 AOP 对象。
(2)Spring AOP 使用的动态代理,所谓的动态代理就是说 AOP 框架不会去修改字节码,而
是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了目标对象的全
部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
(3)静态代理与动态代理区别在于生成 AOP 代理对象的时机不同,相对来说 AspectJ 的静
态代理方式具有更好的性能,但是 AspectJ 需要特定的编译器进行处理,而 Spring AOP 则无
需特定的编译器处理。

11. Spring 的 的 IOC 理解

(1)IOC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是
由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创建实例
和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI 依赖
注入,和控制反转是同一个概念的不同⻆度的描述,即 应用程序在运行时依赖 IoC 容器来
动态注入对象需要的外部资源。
(2)最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 spring 自动生产,使用
java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方
法的。
(3)Spring 的 IOC 有三种注入方式 :构造器注入、setter 方法注入、根据注解注入。
IoC 让相互协作的组件保持松散的耦合,而 AOP 编程允许你把遍布于应用各层的功能分离出
来形成可重用的功能组件。

12. 解释一下 spring bean 的生命周期

首先说一下 Servlet 的生命周期:实例化,初始 init,接收请求 service,销毁 destroy;
Spring 上下文中的 Bean 生命周期也类似,如下:
(1)实例化 Bean:
(2)设置对象属性(依赖注入):
(3)处理 Aware 接口:
(4)BeanPostProcessor:
(5)InitializingBean 与 init-method:
( 6 ) 如 果 这 个 Bean 实 现 了 BeanPostProcessor 接 口 , 将 会 调 用
postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在 Bean 初始化结束时
调用的,所以可以被应用于内存或缓存技术;
(7)DisposableBean:
(8)destroy-method:
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销
毁方法。

13. 解释 Spring 支持的几种 bean 的作用域。

Spring 容器中的 bean 可以分为 5 个范围:
(1)singleton:默认,每个容器中只有一个 bean 的实例,单例的模式由 BeanFactory 自身
来维
护。
(2)prototype:为每一个 bean 请求提供一个实例。
(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回
收器回收。
(4)session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过
期后,bean 会随之失效。
(5)global-session:全局作用域,global-session 和 Portlet 应用相关。当你的应用部署在 Portlet
容器中工作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量
的话,那么这全局变量需要存储在 global-session 中。全局作用域与 Servlet 中的 session 作用
域效果相同。

14. Spring 基于 xml 注入 bean 的几种方式

(1)Set 方法注入;
(2)构造器注入:①通过 index 设置参数的位置;②通过 type 设置参数类型;
(3)静态工厂注入;
(4)实例工厂;

15. Spring 框架中都用到了哪些设计模式?

(1)工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean 默认为单例模式。
(3)代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所
有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。

16. 什么是 Spring Framework

Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度 。它是轻量级、松散耦合的。
它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚
力的框架。它 可以集成其他框架,如 Structs、Hibernate、 EJB 等,所以又称为框架的框
架。

17. 列举 Spring Framework 的优点

由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。
Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。
由于依赖注入和控制反转,JDBC 得以简化。
它是开源免费的。

18. Spring Framework 有哪些不同的功能?

轻量级 - Spring 在代码量和透明度方面都很轻便 。
IOC - 控制反转 AOP - 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。
容器 - Spring 负责创建和管理对象( Bean)的生命周期和配置。
MVC - 对 web 应用提供了高度可配置性,其他框架的集成也十分方便。
事务管理 - 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环
境。
JDBC 异常 - Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。

19. Spring Framework 中有多少个模块, , 它们分别是什么?

Spring 核心容器 – 该层基本上是 Spring Framework 的核心 。 它包含以下模块:
Spring Core
Spring Bean
SpEL (Spring Expression Language)
Spring Context
数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:
JDBC (Java DataBase Connectivity)
ORM (Object Relational Mapping)
OXM (Object XML Mappers)
JMS (Java Messaging Service)
Transaction
Web – 该层提供了创建 Web 应用程序的支持 。 它包含以下模块:
Web
Web – Servlet
Web – Socket
Web – Portlet
AOP 该层支持面向切面编程
Instrumentation 该层为类检测和类加载器实现提供支持。
Test 该层为使用 JUnit 和 TestNG 进行测试提供支持。

20. 什么是 Spring 配置文件?

Spring 配置文件是 XML 文件 。该文件主要包含类信息 。它描述了这些类是如何配置以及
相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大
项目中管理变得非常困难。

21. Spring 应用程序有哪些不同组件?

Spring 应用一般有以下组件:
接口 - 定义功能。
Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
Bean 配置文件 - 包含类的信息以及如何配置它们。
用户程序 - 它使用接口。

22. 使用 Spring 有哪些方式?

使用 Spring 有以下方式:
作为一个成熟的 Spring Web 应用程序。
作为第三方 Web 框架,使用 Spring Frameworks 中间层。
用于远程使用。
作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。

23. 是 什么是 Spring IOC 容器?

Spring 框架的核心是 Spring 容器 。容器创建对象,将它们装配在一起,配置它们并管理
它们的完整生命周期。Spring 容器 使 用依赖注入来管理组成应用程序的组件。容器通过
读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。 该元数据可以通过
XML, Java 注解或 Java 代码提供。

24. 什么是依赖注入?

在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和
服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在
一起。

25. 可以通过多少种方式完成依赖注入?

通常,依赖注入可以通过三种方式完成,即:

  1. 构造函数注入
  2. setter 注入
  3. 接口注入
    在 Spring Framework 中,仅使用构造函数和 setter 注入 。

26. 和 区分构造函数注入和 setter 注入。

构造函数注入 setter 注入
没有部分注入 有部分注入
不会覆盖 setter 属性 会覆盖 setter 属性
任意修改都会创建一个新实例 任意修改不会创建一个新实例
适用于设置很多属性 适用于设置少量属性

27. spring 种 中有多少种 IOC 容器?

BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类 。它会在客户端要求时实例化
bean。
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口 。它在 BeanFactory
基础上提供了一些额外的功能。

28. 分 区分 BeanFactory 和 和 ApplicationContext。 。

BeanFactory|ApplicationContext
它使用懒加载|它使用即时加载
它使用语法显式提供资源对象|它自己创建和管理资源对象
不支持国际化|支持国际化
不支持基于依赖的注解|支持基于依赖的注解

29. 举 列举 IoC 的一些好处。

IoC 的一些好处是:
它将最小化应用程序中的代码量。
它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
它以最小的影响和最少的侵入机制促进松耦合。
它支持即时的实例化和延迟加载服务。

30. Spring IoC 的实现机制

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

31. 是 什么是 spring bean? ?

它们是构成用户应用程序主干的对象。
Bean 由 Spring IoC 容器管理。
它们由 Spring IoC 容器实例化,配置,装配和管理。
Bean 是基于用户提供给容器的配置元数据创建。

32. spring 提供了哪些配置方式?

基于 xml 配置:
bean 所需的依赖项和服务在 XML 格式的配置文件中指定 。 这些配置文件通常包含许多
bean 定义和特定于应用程序的配置选项。 它们通常以 bean 标签开头。
基于注解配置:
您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是
使用 XML 来描述 bean 装配。 默认情况下, Spring 容器中未打开注解装配。 因此,您
需要在使用它之前在 Spring 配置文件中启用它。
基于 Java API 配置:
Spring 的 Java 配置是通过使用 @Bean 和@Configuration 来实现。
1、 @Bean 注解扮演与元素相同的角色。
2、 @Configuration 类 允许通过简单地调用同一个类中的其他@Bean 方法来定义 bean 间
依赖关系。

33. spring 支持集中的 bean scope

Spring bean 支持 5 种 scope:
Singleton - 每个 Spring IoC 容器仅有一个单实例 。
Prototype - 每次请求都会产生一个新的实例。
Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内
有效。
Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session
内有效。
Global-session - 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应
用中才有意义 。 Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web
应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局
portlet Session 的生命周期范围内。 如果你在 web 中使用 global session 作用域来标识
bean,那么 web 会自动当成 session 类型来使用。
仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用 。

34. spring bean 容器的生命周期是什么样的?

spring bean 容器的生命周期流程如下:
1、Spring 容器根据配置中的 bean 定义中实例化 bean。
2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3、 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用
setBeanName()。
4 、 如 果 bean 实 现 BeanFactoryAware 接 口 , 工 厂 通 过 传 递 自 身 的 实 例 来 调 用
setBeanFactory()。
5、如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization()
方法 。
6、如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
7 、 最 后 , 如 果 存 在 与 bean 关 联 的 任 何
BeanPostProcessors , 则 将 调 用
postProcessAfterInitialization() 方法。
8、 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
9、如果为 bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。

35. 是 什么是 spring 部 的内部 bean? ?

只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,
Spring 的基于 XML 的配置元数据在 或 中提供了
元素的使用 。 内部 bean 总是匿名的,它们总是作为原型。

36. 是 什么是 spring 装配

当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。Spring 容器需要知
道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。

37. 自动装配有哪些方式?

Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自
动解析 bean 的协作者。
自动装配的不同模式:
no - 这是默认设置,表示没有自动装配 。 应使用显式 bean 引用进行装配 。
byName - 它根据 bean 的名称注入对象依赖项 。 它匹配并装配其属性与 XML 文件中由
相同名称定义的 bean。
byType - 它根据类型注入对象依赖项。如 果属性的类型与 XML 文件中的一个 bean 名称
匹配,则匹配并装配属性。
构造函数 - 它通过调用类的构造函数来注入依赖项 。它有大量的参数 。
autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType
自动装配。

38. 自动装配有什么局限?

覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将
覆盖自动装配。
基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。
令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

39. 什么是基于注解的容器配置

不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将
配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:
Spring 的 Java 配置是通过使用@Bean 和@Configuration 来实现。
@Bean 注解扮演与<context: annotation-config/>元素相同的角色。
@Configuration 类允许通过简单地调用同一个类中的其他@Bean 方法来定义 bean 间依赖关
系。

40. 如何在 spring 中启动注解装配?

默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过
配置 <context:annotation-config/> 元素在 Spring 配置文件中启用它。

41. @Component, @Controller, @Repository, @Service 有 有

何区别?
@Component : 这将 java 类标记为 bean。 它是任何 Spring 管理组件的通用构造型。
spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
@Controller :这将一个类标记为 Spring Web MVC 控制器。 标有它的 Bean 会自动导入到
IoC 容器中 。
@Service :此 注解是组件注解的特化 。它不会对 @Component 注解提供任何其他行为。
您可以在服务层类中使用@Service 而不是@Component,因为它以更好的方式指定了意图 。
@Repository : 这个注解是具有类似用途和功能的 @Component 注解的特化。 它为 DAO
提供了额外的好处。 它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring
DataAccessException。

42. @Required 注解有什么用?

@Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中
的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属
性,则容器将抛出 BeanInitializationException。

43. @Autowired 注解有什么用?

@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方
法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。 默认情况下,它
是类型驱动的注入 。

44. @## ualifier 注解有什么用?

当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用
@ ## ualifier 和 注解和 @Autowired 通过指定应该装配哪个确
的 切的 bean 来消除歧义。

45. @RequestMapping 注解有什么用?

@RequestMapping 注 解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的
特定类/方法。此注释可应用于两个级别:
类级别:映射请求的 URL
方法级别:映射 URL 以及 HTTP 请求方法

46. Spring DAO 有什么用?

Spring DAO 使得 JDBC, Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式
工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每
种技术不同的异常。

47. Spring JDBC API 中存在哪些类?

JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall

48. 用 使用 Spring 问 访问 Hibernate 的方法有哪些?

我们可以通过两种方式使用 Spring 访问 Hibernate:
1、 使用 Hibernate 模板和回调进行控制反转
2、 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点

49. 举 列举 spring 支持的事务管理类型

Spring 支持两种类型的事务管理:
1、 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,
但维护起来非常困难。
2、 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来
管理事务。

50. spring 些 支持哪些 ORM 框架

Hibernate
iBatis
JPA
JDO
OJB

51. 是 什么是 AOP? ?

AOP(Aspect-Oriented Programming), 即 面 向 切 面 编 程 , 它 与 OOP( Object-Oriented
Programming, 面向对象编程 ) 相辅相成,提供了与 OOP 不同的抽象软件结构的视角.在
OOP 中 , 我们以类 (class)作为我们的基本单元 , 而 AOP 中的基本单元是 Aspect(切面)

52. 是 什么是 Aspect? ?

aspect 由 pointcount 和 advice 组成 , 它既包含了横切逻辑的定义 , 也包括了连接点的
定义 . Spring AOP 就是负责实 施 切面的框架 , 它将切面所定义的横切逻辑编织到切面所
指定的连接点中. AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个
工作:
1、如何通过 pointcut 和 advice 定位到特定的 joinpoint 上
2、如何在 advice 中编写切面代码 .
可以简单地认为,使用@Aspect 注解的类就是切面 .

53. 什么是切点(JoinPoint) )

程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.
在 Spring AOP 中 , join point 总是方法的执行点。

54. 什么是通知(Advice )?

特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截
器,在 JoinPoint“ 周围 ” 维护一系列的拦截器。

55. 有哪些类型的通知(Advice )?

  1. Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用@Before 注解标记进行
    配置。
  2. After Returning - 这 些 类 型 的 Advice 在 连 接 点 方 法 正 常 执 行 后 执 行 , 并 使 用
    @AfterReturning 注解标记进行配置。
  3. After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用
    @AfterThrowing 注解标记配置时执行。
  4. After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异
    常返回,并使用 @After 注解标记进行配置。
  5. Around - 这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行
    配置。

56. 在 指出在 spring aop 中 中 concern 和 和 cross-cutting concern

的不同之处。
concern 是我们想要在应用程序的特定模块中定义的行为 。 它可以定义为我们想要实现的
功能。
cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序 。例如,日志
记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的
问题。

57. AOP 有哪些实现方式?

实现 AOP 的技术,主要分为两大类:
静态代理
指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称
为编译时增强;
编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)。
动态代理
在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
JDK 动态代理
CGLIB

58. Spring AOP and AspectJ AOP 有什么区别?

Spring AOP 基于动态代理方式实现; AspectJ 基于静态代理方式实现 。 Spring AOP 仅支
持方法级别的 PointCut;提供了完全的 AOP 支持,它还支持属性级别的 PointCut。

59. 解 如何理解 Spring 中的代理?

将 Advice 应用于目标对象后创建的对象称为代理。 在客户端对象的情况下,目标对象和代
理对象是相同的。
Advice + Target Object = Proxy

60. 什么是编织(Weaving )?

为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织
( Weaving)。 在 Spring AOP 中,编织在运行时执行。

61. Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型 -视图 -控制器 架构和随时可用的组件,用于开发灵活且松
散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务
逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

62. 下 描述一下 DispatcherServlet 的工作流程

DispatcherServlet 的工作流程:
1、向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获 。
2、 DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源
标识符( URI)。 然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关
的 对 象 ( 包 括 Handler 对 象 以 及 Handler 对 象 对 应 的 拦 截 器 ), 最 后 以
HandlerExecutionChain 对象的形式返回。
3、 DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。( 附注:如
果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 preHandler(…)方法)。
4、提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler ( Controller)。 在
填充 Handler 的入参过程中,根据你的配置, Spring 将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换
为指定的响应信息。
数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等。
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
5、 Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6、根据返回的 ModelAndView,选择一 个 适 合的 ViewResolver (必须是已经注册到 Spring
容器中的 ViewResolver ) 返回给 DispatcherServlet。
7、 ViewResolver 结合 Model 和 View,来渲染视图 。
8、视图负责将渲染结果返回给客户端。

63. 下 介绍一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的扩展 。 它具有 Web 应用程序所需的一些
额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方
面有所不同。

64. 什么是 spring?

Spring 是个 java 企业级应用的开源开发框架。Spring 主要用来开发 Java 应用,但是有些扩
展是针对构建 J2EE 平台的 web 应用。 Spring 框架目标是简化 Java 企业级应用开发,并
通过 POJO 为基础的编程模型促进良好的编程习惯。

65. 使用 Spring 框架的好处是什么?

轻量:Spring 是轻量的,基本的版本大约 2MB。
控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或
查找依赖的对象们。
面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
(JTA)。
异常处理:Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC, Hibernate or JDO
抛出的)转化为一致的 unchecked 异常。

66. Spring 由哪些模块组成?

以下是 Spring 框架的基本模块:
Core module
Bean module
Context module
Expression Language module
JDBC module
ORM module
OXM module
Java Messaging Service(JMS) module
Transaction module
Web module
Web-Servlet module
Web-Struts module
Web-Portlet module

67. 核心容器(应用上下文) 模块。

这是基本的 Spring 模块,提供 spring 框架的基础功能, BeanFactory 是 任何以 spring 为
基础的应用的核心。Spring 框架建立在此模块之上,它使 Spring 成为一个容器。

68. 解释 AOP 模块

AOP 模块用于发给我们的 Spring 应用做面向切面的开发, 很多支持由 AOP 联盟提供,这
样就确保了 Spring 和其他 AOP 框架的共通性。 这个模块将元数据编程引入 Spring。

69. 释 解释 JDBC 和 抽象和 DAO 模块。

通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源错误关闭
导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。 它
还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务管理服务。

70. 解释对象/ 关系映射集成模块。

Spring 通过提供 ORM 模块,支持我们在直接 JDBC 之上使用一个对象 /关系映射映射
(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATIS S## L Maps。
Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。

71. 释 解释 WEB 模块。

Spring 的 WEB 模块是构建在 application context 模块基础之上,提供一个适合 web 应用
的上下文。这 个模块也包括支持多种面向 web 的任务,如透明地处理多个文件上传请求
和程序级请求参数的绑定到你的业务对象。 它也有对 Jakarta Struts 的支持 。

72. ApplicationContext 通常的实现是什么?

FileSystemXmlApplicationContext :此容器从一个 XML 文件中加载 beans 的定义,XML Bean
配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个 XML 文件中加载 beans 的定义,这里,
你需要正确设置 classpath 因为这个容器将在 classpath 里找 bean 配置。
WebXmlApplicationContext:此容器加载一个 XML 文件,此文件定义了一个 WEB 应用的所
有 bean。

73. Bean 和 工厂和 Application contexts 有什么区别?

Application contexts 提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜
像),它们可以向注册为监听器的 bean 发布事件。另 外,在容器或容器内的对象上执行的
那些不得不由 bean 工厂以程序化方式处理的操作,可以在 Application contexts 中以声明
的方式处理 。 Application contexts 实现了 MessageSource 接口,该接口的实现以可 插 拔
的方式提供获取本地化消息的方法。

74. 是 什么是 Spring 的依赖注入?

依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建
对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置
文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把他们组装起来。

75. 的 有哪些不同类型的 IOC (依赖注入)方式?

构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参
数,每个参数代表一个对其他类的依赖。
Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂 方法实例
化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。

76. 哪种依赖注入方式你建议使用,构造器注入,还是

Setter 方法注入?
你两种依赖方式都可以使用,构造器注入和 Setter 方法注入。 最好的解决方案是用构造器
参数实现强制依赖, setter 方法实现可选依赖。

77. 是 什么是 Spring beans?

Spring beans 是那些形成 Spring 应用的主干的 java 对象 。 它们被 Spring IOC 容器初始
化,装配,和管理。 这些 beans 通过容器中配置的元数据创建。 比如,以 XML 文件中 的
形式定义。
Spring 框架定义的 beans 都是单件 beans。 在 bean tag 中有个属性 ” singleton” ,如
果它被赋为 TRUE, bean 就是单件,否则就是一个 prototype bean。 默认是 TRUE,所以
所有在 Spring 框架中的 beans 缺省都是单件 。

78. 个 一个 Spring Bean 义 定义 包含什么?

一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的
生命周期详情及它的依赖 。

79. 给 如何给 Spring 容器提供配置元数据?

这里有三种重要的方法给 Spring 容器提供配置元数据。
XML 配置文件。
基于注解的配置。
基于 java 的配置。

80. 你怎样定义类的作用域?

当定义一个 在 Spring 里,我们还能给这个 bean 声明一个作用域。 它可以通过 bean 定
义中的 scope 属性来定义 。如 ,当 Spring 要在需要的时候每次生产一个新的 bean 实例,
bean 的 scope 属性被指定为 prototype。另 一方面,一个 bean 每次使用的时候必须返回
同一个实例,这个 bean 的 scope 属性 必须设为 singleton。

81. 释 解释 Spring 种 支持的几种 bean 的作用域。

Spring 框架支持以下五种 bean 的作用域:
singleton : bean 在每个 Spring ioc 容器中只有一个实例。
prototype:一个 bean 的定义可以有多个实例。
request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的 Spring
ApplicationContext 情形下有效。
session:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web
的 Spring ApplicationContext 情形下有效。
global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域
仅在基于 web 的 Spring ApplicationContext 情形下有效。缺省的 Spring bean 的作用域是
Singleton.

82. Spring 例 框架中的单例 bean 是线程安全的吗?

不, Spring 框架中的单例 bean 不是线程安全的。

83. 释 解释 Spring 中 框架中 bean 的生命周期。

Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。
Spring 根据 bean 的定义填充所有的属性。
如果 bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。
如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递 beanfactory 给 setBeanFactory
方法。
如 果 有 任 何 与 bean 相 关 联 的 BeanPostProcessors , Spring 会 在
postProcesserBeforeInitialization()方法内调用它们。
如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,
如果 bean 声明了初始化方法,调用此初始化方法。
如果有 BeanPostProcessors 和 bean 关联,这些 bean 的 postProcessAfterInitialization() 方
法将被调用。
如果 bean 实现了 DisposableBean,它将调用 destroy()方法。

84. 的 哪些是重要的 bean 生命周期方法?你能重载它们

吗?
有两个重要的 bean 生命周期方法,第一个是 setup , 它是在容器加载 bean 的时候被调
用。 第二个方法是 teardown 它是在容器卸载类的时候被调用。
The bean 标签有两个重要的属性( init-method 和 destroy-method)。用它们你可以自己定
制初始化和注销方法。 它们也有相应的注解( @PostConstruct 和@PreDestroy)。

85. 是 什么是 Spring 部 的内部 bean? ?

当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义
inner bean,在 Spring 的 基于 XML 的 配置元数据中,可以在 或 元素内使用 元素,内
部 bean 通常是匿名的,它们的 Scope 一般是 prototype。

86. 在 在 Spring 个 中如何注入一个 java 集合?

Spring 提供以下几种集合的配置元素:
类型用于注入一列值,允许有相同的值。
类型用于注入一组值,不允许有相同的值。
类型用于注入一组键值对,键和值都可以为任意类型。
类型用于注入一组键值对,键和值都只能为 String 类型。

87. 是 什么是 bean 装配?

装配,或 bean 装配是指在 Spring 容器中把 bean 组装到一起,前提是容器需要知道 bean
的依赖关系,如何通过依赖注入 来 把 它们装配到一起。

88. 自动装配有哪些局限性?

自动装配的局限性是:
重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String 字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

89. 于 什么是基于 Java 的 的 Spring 注解配置? 给一些注解的

例子.
基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非
通过 XML 文件。
以 @Configuration 注解为例,它用来标记类可以当做一个 bean 的定义,被 Spring IOC 容
器使用 。另一个例子是 @Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注
册进 Spring 应用上下文。

90. 什么是基于注解的容器配置?

相对于 XML 文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。
开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使
用 xml 表述 bean 的装配关系。

91. 怎样开启注解装配?

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在 Spring 配置文件中配
置 context:annotation-config/元素。

92. @Required 注解

这个注解表明 bean 的属性必须在配置的时候设置,通过一个 bean 定义的显式的属性值
或 通 过 自 动 装 配 , 若 @Required 注 解 的 bean 属 性 未 被 设 置 , 容 器 将 抛 出
BeanInitializationException。

93. @Autowired 注解

@Autowired 注 解提供了更细粒度的控制,包括在何处以及如何完成自动装配 。它的用法
和 @Required 一样,修饰 setter 方法、构造器、属性或者具有任意名称和/或多个参数的 PN
方法。

94. @## ualifier 注解

当有多个相同类型的 bean 却只有一个需要自动装配时,将 @ ## ualifier 注解和
@Autowire 注 注 解结合使用以消除这种混淆,指定需要装配
的 的确切的 bean。 。

95. 在 在 Spring 用 框架中如何更有效地使用 JDBC?

使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。 所以开发者只需写
statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供的模板类的帮助
下更有效地被使用,这个模板叫 JdbcTemplate

96. Spring 对 对 DAO 的支持

Spring 对数据访问对象( DAO)的支持旨在简化它和数据访问技术如 JDBC, Hibernate or
JDO 结合使用 。这使我们可以方便切换持久层 。编码时也不用担心会捕获每种技术特有
的异常。

97. 用 使用 Spring 问 通过什么方式访问 Hibernate?

在 Spring 中有两种方式访问 Hibernate:
控制反转 Hibernate Template 和 Callback。
继承 HibernateDAOSupport 提供一个 AOP 拦截器。

98. 如 何 通 过 HibernateDaoSupport 将 Spring 和

Hibernate 结合起来?
用 Spring 的 SessionFactory 调用 LocalSessionFactory。 集成过程分三步:
配置 the Hibernate SessionFactory。
继承 HibernateDaoSupport 实现一个 DAO。
在 AOP 支持的事务中装配。

99. Spring 支持的事务管理类型

Spring 支持两种类型的事务管理:
编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和 XML 配置
来管理事务。

100. Spring 框架的事务管理有哪些优点?

它为不同的事务 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一个不变的编程模式。
它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API
它支持声明式事务管理。
它和 Spring 各种数据访问抽象层很好得集成。

101. 你更倾向用那种事务管理类型?

大多数 Spring 框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符
合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式
事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

102. 在 在 Spring AOP 中,关注点和横切关注的区别是什

么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日
志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

103. 有几种不同类型的自动代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
otConfiguration:组合了 @Configuration 注解,实现配置

小白路漫漫,让我们一起加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值