##java面试题大全
点赞、收藏、加关注
·
·
Spring面试题
- ##java面试题大全
- 1、什么是 Spring Framework
- 2、列举 Spring 框架的优点
- 3、Spring 框架有哪些不同的功能
- 4、Spring 框架中有多少个模块,它们分别是什么
- 5、什么是 Spring 配置文件
- 6、Spring 应用程序有哪些不同的组件
- 7、什么是 Spring IoC 容器
- 8、什么是依赖注入(控制反转)
- 9、可以通过多少种方式完成依赖注入
- 10、构造函数注入和 setter 注入区别
- 11、Spring 中有多少种 IOC 容器
- 12、说一下 IoC 的优点
- 13、Spring IoC 的实现机制
- 14、什么是 Spring bean
- 15、Spring 框架提供了哪些配置方式
- 16、Spring支持的五种 Bean Scope?单例的是线程安全的嘛
- 17、Spring Bean容器的生命周期是什么样的
- 18、什么是 Spring 的内部 Bean
- 19、自动装配有哪些方式
- 20、自动装配有哪些局限性
- 21、什么是基于注解的容器配置
- 22、如何在 Spring 中启动注解装配
- 23、@Component,@Controller,@Repository,@Service 四者有何区别
- 24、@Required 注解有什么用
- 25、@Autowired 注解有什么用
- 26、@Qualifier 注解有什么用
- 27、@RequestMapping 注解有什么用
- 28、Spring DAO 是什么
- 29、Spring JDBC API 中存在哪些类
- 30、使用 Spring 访问 Hibernate 的方法有哪些
- 31、列举 Spring 支持的事务管理类型,什么情况下事务会失效
- 32、Spring 支持哪些 ORM 框架
- 33、什么是 AOP
- 34、什么是切面(aspect)
- 35、什么是切点(pointcut)
- 36、什么是通知(Advice)
- 37、关注点(concern)和横切关注点(cross-cutting concern)有什么不同
- 38、AOP 底层用什么实现
- 39、Spring AOP 和 AspectJ AOP 有什么区别
- 40、什么是编织(Weaving)
- 41、Spring MVC 框架有什么用
- 42、描述一下 SpringMVC 的请求处理的全过程
1、什么是 Spring Framework
Spring Framework,即 Spring 框架。Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架。Spring 的核心有两部分:IoC 控制反转
,AOP 面向切面编程
2、列举 Spring 框架的优点
- 开源免费
- 方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给 Spring 管理
- AOP 编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
- 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无须手动编程
- 方便程序的测试: Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
- 方便集成各种优秀的框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持
- 降低JavaEE API的使用难度:Spring 对 JavaEE 开发中非常难用的一些 API (JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低
3、Spring 框架有哪些不同的功能
- 控制反转和依赖注入:Core Container 功能模块提供
- 面向切面编程:AOP & Aspects 功能模块提供
- 提供了对 junit 或 TestNG 测试框架的整合:Testing 功能模块提供
- 提供了对数据访问/集成的功能:Data Access/Integration 功能模块提供
- 提供了面向 Web 应用程序的集成功能:Soring MVc 功能模块提供
4、Spring 框架中有多少个模块,它们分别是什么
详细解释在这篇文章中:Spring 框架所有模块详解
5、什么是 Spring 配置文件
Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。一般我们都会给它起一个默认的名字:applicationContext.xml
6、Spring 应用程序有哪些不同的组件
- 接口 —— 定义功能
- Bean 类 —— 它包含属性,setter 和 getter 方法,函数等
- Bean 配置文件 —— 包含类的信息以及如何配置它们
- 面向切面编程(AOP) —— 提供面向切面编程的功能
- 应用程序 —— 它使用接口
7、什么是 Spring IoC 容器
负责创建对象、管理对象(通过依赖注入(DI))、装配对象、配置对象,并且管理这些对象的整个生命周期的容器就是 Spring IoC容器
8、什么是依赖注入(控制反转)
依赖注入(DI)与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。具体含义是:当某个角色(可能是一个 Java 实例,调用者)需要另一个角色(另一个 Java 实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在 Spring 里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入
9、可以通过多少种方式完成依赖注入
1:构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。使用 constructor-arg 标签
优点: 对象初始化完成后便可获得可使用的对象
缺点: 当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦
2:setter方法注入
IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类。使用 property 标签
优点: 灵活。可以选择性地注入需要的对象
缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用
3:接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象
优点: 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可
缺点: 侵入性太强,不建议使用
拓展:什么是侵入性:
如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性
10、构造函数注入和 setter 注入区别
- 在 setter 注入中,可以将依赖项部分注入;构造方法注入不能部分注入,因为调用构造方法时,如果传入部分参数就会报错
- setter 注入将覆盖构造方法注入;构造方法注入不能覆盖 setter 注入值
- 使用 setter 注入的情况下 Spring 会先调用对象的构造函数;对于构造器注入,Spring 会在调用构造函数前把构造函数需要的依赖对象都实例化好,然后再把这些实例化后的对象作为参数去调用构造函数
- 构造函数注入时,如果 A对象 和 B对象 相互依赖:A 依赖于 B,B 也依赖于 A,此时在创建对象的 A 或者 B 时,Spring 会抛出 ObjectCurrentlyInCreationException;可以通过 setter 注入,解决循环依赖的问题
11、Spring 中有多少种 IOC 容器
常用的两种,详情和区别如下
Spring BeanFactory 容器:
- 最简单的容器,给 DI 提供了基本的支持
- 默认采用延迟初始化策略,容器启动初期速度快,所需资源有限。移动设备中为了节省有限的资源,会被优先选择。即主要用于轻量级应用
- 其用 org.springframework.beans.factory.BeanFactory 接口来定义
- BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,BeanFactory 需要手动注册
- 不支持国际化
- 不支持注解
Spring ApplicationContext 容器:
- 在 Spring BeanFactory 容器的基础上,添加了更多企业特定的功能,比 BeanFactory 更加优秀
- ApplicationContext 所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成,所以容器启动时间较 BeanFactory 会更长
- 其用 org.springframework.context.ApplicationContext 接口来定义
- BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用,ApplicationContext 自动注册
- 支持国际化
- 支持注解
12、说一下 IoC 的优点
- 资源集中管理,实现资源的可配置和易管理
- 降低了使用资源双方的依赖程度,也就是经常说的耦合度,提高了程序的可维护性
- 使应用的代码量降低
- 支持加载服务时的即时加载和懒加载
13、Spring IoC 的实现机制
Spring 中的 IoC 的实现原理是工厂模式加反射机制
工厂模式:
调用一个工厂方法根据传入的参数返回一个对象
反射:
反射就是在工厂模式 getBean() 方法中通过反射的方式来创建 Bean。反射会根据 getBean(name) 中传入的 name 找到类全路径然后进行创建Bean对象
14、什么是 Spring bean
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是一个由 Spring IoC 容器实例化、组装和管理的对象
15、Spring 框架提供了哪些配置方式
基于 xml 配置:
bean所需的依赖项和服务在 XML 格式的配置文件中指定
<bean id="testbean" class="cn.hyl.SpringDemo.TestBean">
<property name="name" value="xtl"></property>
</bean>
基于注解配置:
通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身。在类上面使用 @Component 或其子类(@Repository、@Service、@Controller)来定义 bean
@Component
public class Test {
}
基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。@Bean 注解扮演与元素相同的角色。@Configuration 声明一个类时配置类
@Configuration
@ComponentScan("需要扫描的包名")
public class WebConfig {
@Bean
public Test test() {
return new Test();
}
}
16、Spring支持的五种 Bean Scope?单例的是线程安全的嘛
Singleton:
默认值,表示 Spring 容器只创建唯一一个 bean 的实例。Spring 里面的 bean 是默认是单例的,可以使用 @Scope 注解来指定模式。平常我们使用的都是没有状态的 bean,没有状态就是没办法修改的对象,所以没有线程安全问题,但是如果这个 bean 有可以修改的成员变量,那么就需要注意线程安全的问题,可以使用多例模式或者加锁
Prototype:
代表线程每次调用或请求这个 bean 都会创建一个新的实例。一般情况下,有状态的 bean 使用该 scope
Request:
每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效
Session:
每个 Session 作用域内的请求只创建一个实例
Global Session:
它仅仅在基于 portlet 的 web 应用中才有意义。portlet 规范定义了全局 Session 的概念。如果在 web 中使用 Global Session 作用域来标识 bean,那么 web 会自动当成 Session 类型来使用
17、Spring Bean容器的生命周期是什么样的
根据 BeanDefinition对象创建Bean,该类里面保存了Bean的相关信息
- Spring 容器根据配置中的 bean 定义中实例化 bean
- Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置
- 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()
- 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()
- 如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法
- 如果为 bean 指定了 init 方法( 或 init-method 属性),那么将调用它
- 如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法,通常用它来增强类
- 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用destory()
- 如果为 bean 指定了 destroy 方法( 或 destroy-method 属性),那么将调用它
18、什么是 Spring 的内部 Bean
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 < property > 或 < constructor-arg > 中提供了 < bean > 元素的使用。内部 bean 总是匿名的,它们总是作为原型
19、自动装配有哪些方式
no:
默认的方式是不进行自动装配的,通过手工设置 ref 属性来进行装配 bean
byName:
通过 bean 的名称进行自动装配。如果一个 bean 的 property 与另一个 bean 的 name 相同,就进行自动装配
byType:
通过参数的数据类型进行自动装配.
constructor:
利用构造函数进行装配,并且构造函数的参数通过 byType 进行装配
autodetect:
自动探测,如果有构造方法,通过 construct 的方式自动装配,否则使用 byType 的方式自动装配
20、自动装配有哪些局限性
- 你如要仍然需要使用 < property >设置指明依赖,这意味着要重写自动装配
- 不能自动装配简单的属性,如原生类型、字符串和类
- 自动装配总是没有自定义装配精确
21、什么是基于注解的容器配置
不使用 XML 来描述 bean 装配,开发人员通过在相关的类、方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现
@Configuration
public class XtlConfig {
@Bean
public XtlBean xtl() {
return new XtlBean();
}
}
22、如何在 Spring 中启动注解装配
默认情况下,Spring 容器中未打开注解装配。要使用基于注解装配,必须通过配置 < context:annotation-config /> 元素在 Spring 配置文件中启用它
23、@Component,@Controller,@Repository,@Service 四者有何区别
四个注解实现的基本功能是一样的,作用相当于配置文件的 bean 标签,被注解的类,spring 始化时,就会创建该对象。不同点是区分的业务层不同
- @Component :它是任何 Spring 管理组件的通用构造型
- @Controller :用在控制层,这将一个类标记为Spring Web MVC控制器
- @Service :用在服务层
- @Repository :用在 DAO 层,这个注解是 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException
24、@Required 注解有什么用
这个注解表示,受影响的 bean 属性必须在配置的时候被填充,通过 bean 定义或通过自动装配一个明确的属性值
25、@Autowired 注解有什么用
在构造函数上使用:
在 Spring 初始化对象实例时,会调用此构造函数,进行对象的实例化。一般是当一个类中有多个构造方法,且要选择某一个构造方法进行 Spring 实例化时,可以在构造方法上加 @Autowired 注解
在类属性上使用:
将此属性进行注入,默认按照类型注入
在其他方法上使用:
当 Spring 容器调用该类的构造方法,实例化完成该类后,会调用 @Autowired 修饰的方法,并将方法的参数进行实例化,但是必须保证该方法的参数对象在 Spring 容器中也存在,否则会报错
26、@Qualifier 注解有什么用
该注解可以使用在类上、属性上、参数上、方法上。当使用在类上的时候,里面填写的 @Qualifier 值就是当前 bean 的唯一标识,在依赖该 bean 的地方使用 @Autowired + @Qualifier 可以使用该 bean 的名称注入或者该 bean 前面指定的唯一标识
27、@RequestMapping 注解有什么用
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类或者方法。此注释可应用于两个级别:类级别:表示类中的所有响应请求的方法都是以该地址作为父路径;方法级别:对应执行此方法
28、Spring DAO 是什么
Spring 的 DAO 不是新发明一种技术,而是对原来技术的一种封装,定义了一套简单实用的 api 。使得 JDBC,Hibernate 或 JDO 这样的数据访问技术以一种统一的方式工作,这使得用户容易在持久性技术之间切换。它还对各种技术的异常进行了封装,使开发者无需考虑捕获每种技术不同的异常
29、Spring JDBC API 中存在哪些类
- JdbcTemplate
- SimpleJdbcTemplate
- NamedParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
30、使用 Spring 访问 Hibernate 的方法有哪些
- 使用 Hibernate 模板和回调进行控制反转
- 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点
31、列举 Spring 支持的事务管理类型,什么情况下事务会失效
类型:
- 程序化事务管理:在此过程中,在编程的帮助下管理事务,它为您提供大的灵活性,但维护起来非常困难
- 声明式事务管理:在此,事务管理与业务代码分离,仅使用注解或 xml 的配置来管理事务
失效:
- 在方法中捕获异常没有抛出去
- 非事务方法调用事务方法
- 事务方法内部调用事务方法,被调用者的事务是不会生效,会合并成一个事务
- @Transactional 标记的方法不是 public
- 抛出的异常与属性 rollbackFor 指定的异常不匹配,默认 rollbackFor 指定的异常为 RuntimeException
- 数据库表不支持事务,比如 MySQL 的 MyISAM
- Spring 的传播行为导致事务失效,比如:PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED
- PROPAGATION_REQUIRED --支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
- PROPAGATION_SUPPORTS --支持当前事务,如果当前没有事务,就以非事务方式执行
- PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常
32、Spring 支持哪些 ORM 框架
- Hibernate
- iBatis
- JPA
- JDO
- OJB
33、什么是 AOP
面向切面编程,首先,在面向切面编程的思想里,把功能分为核心功能和周边功能
- 核心功能:比如 登录,增加,删除数据都叫核心业务
- 周边功能,比如性能统计,日志,事务管理等
- 周边功能在 Spring 面向编程的思想中,即被定义为切面
- 在面向切面编程 AOP 的思想里,把核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫 AOP
34、什么是切面(aspect)
切面由切点(pointcut)和通知(advice)组成,横切逻辑的定义。@Aspect 来标注此类是一个切面类,在切面类里面由切点、通知等代码组成,需要增强的的功能代码等就写在此类里面
35、什么是切点(pointcut)
切点,每个类都拥有多个连接点,是一个连接点的集合。主要写在切面类里面,用 @Pointcut 来标注某个方法为一个切入点方法。如:@Pointcut("execution(public * cn.hyl.aop.service.* . (…))");切入点表达式规则:修饰符(可以不写,但不能用代替)+ 返回类型(可用 * 号指代不限返回类型)+ 包路径下的类(可用 * 指代所有的类)+ 哪些方法(可用 * 指代此类下的所有方法)+(…)(参数不限个数不限类型)
36、什么是通知(Advice)
在特定切点处处,切面所采取的动作称为通知。动作是在切点处的什么时间增强,增强什么内容
通知注解有:
- @Before:前置通知(在切入目标方法执行之前执行)
- @After:后置通知(在目标方法执行之后执行,无论是否发生异常)
- @AfterReturning:返回通知(在目标方法返回结果之后执行)
- @AfterThrowing:异常通知(在目标方法抛出异常之后执行)
- @Around:环绕通知(围绕着方法执行)
37、关注点(concern)和横切关注点(cross-cutting concern)有什么不同
concern:
是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能
cross-cutting concern:
是一个适用于整个应用的行为,这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题
38、AOP 底层用什么实现
两种
- 静态代理:指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强
- 动态代理:CGLIB、JDK 动态代理
39、Spring AOP 和 AspectJ AOP 有什么区别
- Spring AOP 是 Spring 支持的面向切面 AOP 编程;AspectJ 是一个面向切面的框架,它扩展了 Java 语言,AspectJ 定义了 AOP 语法
- Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现
- Spring AOP 属于运行时增强;AspectJ 属于编译时增强
- Spring AOP 创建目标对象的代理,切面在代理中执行;AspectJ 执行程序前,各方面直接织入代码中
- Spring AOP 仅支持方法级别的 PointCut;AspectJ 提供了完全的 AOP 支持,它还支持属性级别的 PointCut
- AspectJ 的运行速度要快于 Spring AOP
40、什么是编织(Weaving)
为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行
41、Spring MVC 框架有什么用
Spring MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。MVC 模式有助于分离应用程序的不同方面,如:输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合
42、描述一下 SpringMVC 的请求处理的全过程
SpringMVC 的四大组件:
- DispacherServlet:调度中心
- HandlerMapping:处理映射器。维护一个Map,用来保存请求路径和类名方法名的映射关系
- HandlerAdapter:处理适配器。用来处理参数、返回值
- ViewResovler:视图解析器。将代码转化为视图
前后端不分离的项目:
前后端分离项目:
分离项目返回为 JSON 数据,没有 ModelAndView 对象。所以 HandlerAdapter 会经过适配请求一个合适的处理器 Handler,它检查方法上添加了@ResponseBody,然后通过 HttpMessageConverter 来返回结果并转换为 JSON 响应