Spring面试题
1.Spring是什么
spring:是一个一站式的轻量级的java开发框架,核心是控制反转(IOC),面向切面编程(AOP),针对于开发的WEB层(SpringMVC),业务层(IOC),持久层(JdbcTemplate)等提供了多种配置解决方案
2.AOP和IOC
IOC(控制反转)
是指容器控制程序对象之间的关系,而不是传统实现中,有程序代码直接操控,控制权由应用代码中转到了外部容器,控制权的反转就是控制反转,这是一种面向对象的编程思想,而spring采用依赖注入的方式实现了IOC
DI(依赖注入)
组件之间的依赖在运行期决定,由容器动态的将某种依赖关系注入到组件之中
AOP(面向切面编程)
它是为了解耦而生的,当需要进行批量操作时,我们可以将公共代码逻辑抽象出来变成一个切面类,然后注入到目标对象中去
通过动态代理的方式将需要注入的目标对象进行代理,在进行调用的时候,将公共逻辑直接添加进去,而不修改原有的代码业务逻辑,只需要在原来的业务逻辑上做一些增强功能即可
3. AOP的通知(增强)方式
- Before(前置),用于方法前增强,会在目标方法执行前运行
- After-returning(返回后):方法正常执行后增强
- After-throwing(抛出后):方法执行通过抛出异常退出时
- Arround(环绕):环绕在目标的前后执行,它有机会在方法运行之前和之后进行工作,并确定该方法何时,如何以及真正开始运行,环绕通知可以决定目标方法的调用也可以控制返回对象
- After:方法执行退出时执行增强,不管是正常返回,还是抛出异常退出,相当于try{}catch{}finally中的finally的语句
4.Spring依赖注入的方式
在Spring容器中Bean配置依赖注入有四种方式:
- 使用setter方法注入
- 使用构造器注入
- 用注解方式注入
- 静态、实例工厂注入
5.@Resource与@Autowired的区别
两者都算是依赖注入注解注入的方式
@Resource
这是JDK的注解,两个属性比较重要name、type,@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
默认是根据名字注入,其次是根据类型注入
@Autowired
该注解可以用于成员变量、set方法、构造器上,默认是根据类型自动注入
@Autowired采取的策略为按照类型注入
public class UserService{
@Autowrired
private UserDao userdao;
}
spring容器找到类型为UserDao的类,然后将其注入进来
但是当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候就需要配合@Qualifier使用
public class UserService{
@AutoWired
@Qualifier(name="userDao1")
private UserDao userdao;
}
@Quelifier注解可以与@AutoWired注解组合使用,达到通过类型和名称一起筛选Bean的效果。
6.注入Bean的注解
@Value:用于将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值
@Bean:可以用来装配任何Bean
@Component :基本注解,标识了一个受Spring管理的组件
@Responsitory:标识持久层组件
@Service:标识服务层(业务层)组件
@Controller:标识表现层组件
7.@Bean
@Bean通常出现的位置是带有@Configuration注解的类中,但是这不是必要条件,也能出现在@Component注解的类中,甚至是普通类
结论:只要当前类会被容器解析为beanDefinition(简单理解为bean),那么它内部的@Bean等注解就会生效
8.Bean的作用域
bean的作用域有 @scope 注解来修改,该注解有五个不同的取值,分别是:singleton、prototype、request、session、global-session
Spring容器最初提供了两种bean的scope类型:singleton和prototype
spring2.0后引入了三种scope类型:request、session、global session
不过这三种类型只能在WEB应用中使用,只有WEB应用的ApplicationContext中使用这三个Scope才合理
作用域 | 描述 |
---|---|
singleton | 使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。 |
prototype | 使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。 |
request | 该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。 |
session | 该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。 |
global-session | 该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。 |
9.Spring创建的Bean是否线程安全
spring创建的Bean是线程不安全的,因为是多个对象共用一个实例,想让它变成线程安全可以改变Bean的声明周期,将singleton(单例)改为prototype(多例)
10.Spring容器类
Spring提供了众多的容器类,最常见的BeanFactory和ApplicationContext
BeanFanctory是Spring容器的接口
ApplicationContext是BeanFanctory的子接口
ListableBeanFactory HierarchicalBeanFactory接口实现BeanFactory
11.BeanFactory和FactoryBean的区别
BeanFactory是所有Spring Bean的容器根接口
FactoryBean是一种创建Bean的方式
12.Spring事务
Spring中有两种事务的实现方式:编程式事务管理和编码式事务管理
编程式事务一般使用的是TransactionTemplate工具类来实现
spring中使用的是 @Transection注解,@Transaction 是 Spring 提供用来控制事务回滚/提交的一个注解,让我们从编程式注解转换到声明式注解。可作用于接口、接口方法、类、及类方法上
@Transection作用在类上时,代表这个类的所有公共非静态方法都将启用事务
其中有两个重要的属性:propagation(事务的传播行为)、isolation(事务的隔离级别)
propagation(事务的传播行为)
行为名 | 描述 |
---|---|
PROPAGATION_REQUIRED(常用) | 支持当前事务,如果当前没有事务,就新建一个事务 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行 |
PROPAGATION_MANDATORY | 支持当前事务,如果当前没有事务,就抛出异常 |
PROPAGATION_REQUIRESNEW | 新建事务,如果当前存在事务,把当前事务挂起 |
PROPAGATION_NOTSUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 |
PROPAGATION_NEVER | 以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则进⾏与PROPAGATION_REQUIRED类似的操作 |
isolation(事务的隔离级别)
描述 | |
---|---|
ISOLATION_DEFAULT =-1 | 使⽤数据库默认的事务隔离级别 |
ISOLATION_READUNCOMMITTED=1 | 这是事务最低的隔离级别,它充许别外⼀个事务可以看到这个事务未提交的数据。这种隔离级别会产⽣脏读,不可重复读和幻读。 |
ISOLATION_READCOMMITTED=2 | 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。 |
ISOLATION_REPEATABLEREAD=4 | 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读 |
ISOLATION_SERIALIZABLE=8 | 这是最高级别最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,不可重复读外,还避免了幻读。 |
13.Spring中的注解
上面介绍的就不再写了
- @Configuration:用于声明配置类,该注解基于@Component实现的,它的作用和bean.xml一样
- @Qualifier:用于声明Bean的名称,该注解只能引入Bean的自定义名称,可以引入默认名称
- @ComponentScan:用于定义Bean的扫描策略,默认规则是对当前包及其子包中的Bean进行扫描,basePackages属性用于自定义要扫描哪些属性
注:@ComponentScan注解只是定义了扫描范围,在此范围内带有特定注解的的Bean才会被载入容器
14.Spring中使用到的设计模式
单例模式:spring中的Bean都是单例的
代理模式:AOP的动态代理
模板方法模式:Spring中的JdbcTemplate、hibernateTemplate等以Template结尾的数据库操作类,它们使用了模板模式
适配器模式:Spring AOP的增强或通知使用到了适配器模式,Spring MVC中也用到了适配器模式适配controller
工厂模式:Spring通过BeanFactory、ApplicationContext创建Bean对象
这并不是所有使用到的设计模式,我只是列举了几个
SpringMVC面试题
15.SpringMVC是什么
SpringMVC是Spring基础之上的一个MVC框架,主要处理WEB开发的路径和视图渲染,是属于Spring的WEB层开发的一部分
MVC分为 model View Controller 三层
16.SpringMVC中的组件
- DispatcherServlet 前端控制器:主要负责捕获来自客户端的请求和调度各个组件
- HandlerMapping 处理器映射器:根据url查找后端控制器handler
- HandlerAdapter 处理器适配器:执行后端控制器(Handler),拿到后端控制器返回的结果ModelAndView后将结果返回给前端控制器DispatcherServlet。
- Hadler 处理器:主要负责处理前端请求,完成业务逻辑,生成ModelAndView对象返回给HandlerAdapter。
- ViewResoler视图解析器:主要负责将从DispatcherServlet中拿到的ModelAndView对象进行解析,生成View对象返回给DispatcherServlet
17.SpringMVC的执行流程
第一步:客户端发送一个HTTP请求给WEB服务器,WEB服务器对请求进行解析,匹配DispatcherServlet的请求映射路径
第二步:DispatcherServlet获取到请求,根据HandlerMapping找到具体处理请求的Handler
第三、四步:DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler
(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用
第五步:Handler对数据处理完成后返回一个ModelAndView()对象给DispatcherServlet
第六步:DispathcherServlet通过ViewResolver将逻辑视图转成真正的视图
第七步:DispathcherServlet通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端
18.@RequestMapping
@RequestMapping(path="/user",method=RequestMethod.POST)
声明类或方法的访问路径,还可以声明请求的方式
常见的请求方式
请求方式 | 描述 |
---|---|
POST | 传参,用来新增操作,提交数据 |
PUT | 传参,主要用来修改数据,更新数据 |
DELETE | 删除某个资源 |
GET | 用来获取数据,不对数据库进行修改 |
19.传参类型的注解
注解 | 描述 | |
---|---|---|
@RequestHeader() | 请求头中变量值映射到控制器的参数中 | header |
@RequestParam() | 将请求对象中的参数,绑定到控制器中方法的参数 | query |
@PathVariable() | 将请求路径中的参数,绑定到控制器中方法的参数 | path |
@RequestBody() | 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入Response对象的Body区,通常来返回JSON数据或者是XML数据 | body |
20.SpringMVC拦截器
拦截器是SpringMVC的核心应用组件,主要用于处理多个Controller的共性问题。当我们的请求有DispatcherServlet派发到具体Controller之前首先需要执行拦截器中一些相关方法,这些方法可以决定对请求时拦截还是放行
拦截器需要实现HandleInterceptor接口,或者继承HandlerInterceptorAdaptor抽象类
21.拦截器和过滤器的区别
拦截器和过滤器都是AOP编程思想的实现
不同在于
1.规范:
拦截器是在Spring容器内的是Spring框架支持的
而过滤器是Servlet规范规定的,是Servlet支持的
2.适用范围
拦截器即可以用在WEB层也可以用在Application
而过滤器是servlet规范规定的,只能用于WEB程序中
22.@ControllerAdvice和@ExceptionHandler
@ExceptionHandler,方法注解,作用于Controller级别,为一个Controller定义一个异常处理器
@ControllerAdvice,类注解,作用于整个Spring工程,定义了一个全局的异常处理器
23.@RestController与@Controller区别
@RestController是SpringMVC的注解是一个组合注解:@Controller+@RequestBody
@RestController:是不能直接返回视图的,返回的是JSON格式的数据
@Controller:是能够直接返回指定的页面的,@Controller配合视图解析器InternalResourceViewResolver
SpringBoot面试题
24.SpringBoot是什么
SpringBoot是一个全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署,使用SpringBoot可以做到专注于Spring应用的开发,而无需关注XML配置,基于Spring使用大量starter提供的自动配置帮助我们快速构建Spring应用程序
25.SpringBoot的优点
Spring Boot本身并不提供Spring的核心功能,而是作为Spring框架的脚手架框架,以达到快速构建项目,预置第三方配置,开箱即用的目的
26.@SpringBootApplication
@SpringBootApplication是SpringBoot项目的核心注解,主要作用是启动自动配置
这也是一个组合注解
@Configuration+@EnableAutoConfiguration+@ComponentScan
启动自动配置的核心注解
@EnableAutoConfiguration
主要功能是启动Spring应用程序上下文时进行自动配置
它会尝试猜测并配置项目可能需要的Bean。自动配置通常是基于项目classpath中引入的类和已定义的Bean来实现的,在此过程中,被自动配置的组件来自项目自身和项目依赖的jar包中。
从源代码得知@Import是@EnableAutoConfiguration注解的组成部分,也是自动配置功能的核心现者。
这里是引用
27.SpringBoot的自动装配原理
SpringBoot的启动类上有一个注解叫做SpringBootApplication, 该注解中有一个EnableAutoConfiguration注解,这个注解就是启用自动配置的注解,这个注解中通过@Import载入了一个Register.class的类,该类最终会读取配置构建一个Configuration类型的集合,所有的配置都会去starter包中的meta-info下的spring.factories文件中查找,该文件中记录了非常多的AutoConfiguration类,这些类都是Spring的配置类,每个配置类中编写了大量默认的配置,并通过Conditional注解来设置生效条件。
28.SpringBoot加载配置文件的顺序?如果配置文件有相同的配置属性,该如何处理?
加载顺序:properties>xml>yml
如果配置文件又相同属性,先读取到的生效,后读取的会加载,但是不会覆盖前面读取到的配置
29.SpringBoot的核心功能
1.自动装配
AutoConfiguration 自动配置的启动器(starters)
SpringBoot项目自动提供最优配置,同时可以修改默认满足特点的要求
2.起步依赖
SpringBoot将完成一个功能所需的所有坐标打包到一起,并完成所有版本适配,我们在使用某功能时只需要引入一个依赖即可
30.SpringBoot读取配置文件的方式
@Environment
@Value
@ConfigurationProperties:用于指定properties文件地址
31.SpringBoot、SpringMVC、Spring区别
Spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC),面向切面编程(AOP),针对于开发的WEB层(SpringMVC),业务层(IOC),持久层(jdbcTemplate)等提供了多种配置解决方案
SpringMVC是spring提供的mvc框架,涵盖了前端视图开发,文件配置,后台接口逻辑开发,其中的XML和config的配置相对繁琐复杂
SpringBoot相对于springMVC框架来说,更加专注于开发微服务后台接口,而不开发前端视图,同样遵循默认优于配置,简化了插件配置的流程,不需要配置xml,相对于springmvc,大大简化了配置流程
今天面试题就聊到这里吧,里面如果介绍的有问题的欢迎兄弟们指出错误,博主是很高兴接受兄弟们的建议的