spring框架相关面试题
spring框架相关面试题
1. Spring框架中的单例bean是线程安全的吗
不是线程安全的
spring中有一个@scope注解,默认的值就是Singleton,单例的
因为在spring框架中的bean都是注入无状态的对象,没有线程安全问题。如果使用了可以修改的成员变量,要考虑线程安全问题可以使用多例或者加锁来实现
2. 什么是aop
对aop的理解和有没有用过aop
AOP称为面向切面编程,用于那些对业务没有用,但是却对多个对象产生公共行为和逻辑,抽取并封装成一个可以重用的模块,这个模块别成为切面,减少对系统的重复代码,降低模块之间的耦合度,同时提高系统的可维护度。
使用场景:
- 记录操作日志:抽取为一个切面类 由这个切面类做增强
- 缓存的处理
- spring中内置的事务处理
Spring事务是如何实现的
编程式事务和声明式事务两种方式
编程式事务管理:需使用TransactionTemplate实现对业务代码有侵入,对项目中很少使用
声明式事务管理: 建立在AOP之上。本质是通过AOP功能对方法前后进行拦截,将事务处理的功能编制到拦截的方法中也就是在目标方法已经开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚
面试回答:
什么是aop
面向切面编程,用于将那些与业务无关的。但却对多个对象产生影响的公共行为和逻辑。抽取公共模块复用,降低耦合。
你们项目中有没有使用到aop
记录操作日志,缓存,spring并实现事务 核心是使用sop中的环绕通知+切点表达式,通过环绕通知的参数获取方法的参数,注解,请求方式,获取到数据保存到数据库
spring事务是如何实现的
通过Aop功能对方法前后进行拦截,在执行前开启方法,执行完后根据执行情况提交或者回滚数据
3. spring中事务失效的场景有哪些
- 异常捕获处理
异常捕获处理,自己处理了异常没有抛出
解决:在catch块中吧异常抛出事务就不会失效了 - 抛出检查异常
spring默认会回滚非检查异常
解决:配置rollbackFor属性 @Transactional(rollbackFor=Exception.class) - 非public方法
spring创建代理添加事务前提是public方法
4. spring框架的bean的生命周期
bean的生命周期就是Bean从创建到销毁的整个过程分成4大步
- 实例化
a. 通过反射去推断构造函数去进行实例化
b.实例工厂 静态工厂 - 属性赋值
a.解析自动装配bean(@autowired)DI的体现 依赖注入
b.循环依赖 - 初始化
a.调用一些BeanXXXXAware
b.调用初始化生命周期回调(三种方式)
c.如果bean实现了aop 创建动态代理 - 销毁
a.在spring容器关闭的时候调用
b.调用销毁的生命周期回调
Bean的流程:spring容器在进行实例化的时候,会将xml中配置的
5. spring中的循环引用
在创建a对象的时候同时使用了b对象,在创建b对象的时候使用了a对象。不一定就是两个对象也可能是三个对象循环引用(spring框架已经解决了大多数的循环依赖:三级缓存初始化过程中的循环引用,不能解决构造函数的循环引用,构造函数自己用懒加载 @lazy用的时候加载)
一级缓存:单例池,经历了所有生命周期的bean存放的地方
二级缓存:思想就是先把半成品放入二级缓存然后读取的时候读取半成品,创建成功放入一级缓存中然后,另一个再调用就OK了(一般对象的循环引用)
代理对象的循环引用(三级缓存)
6.springmvc的执行流程
难5出现5
核心内容就是两种方式:一种是视图阶段(jsp等)一种是前后端分离阶段(接口开发)
视图阶段 浏览器请求前端控制器(DispatcherServlet)然后查询heandler,找到处理器映射器(HandleMapping)这里是一个key,value,key是映射器value是类名方法名,然后返回给前端控制器返回一个处理器执行链(HandlerExectionChain)。前端控制器再加载处理器适配器(HeadleAdaptor)处理参数和返回值,然后请求处理器(Handler),处理器(handler)响应结果,然后处理器适配器返回ModelAndView。然后前端控制器返回视图解析器把逻辑视图转化为真正的视图,最后再找到视图渲染视图。
重要的组件DispatcherServlet HandlerMapping HandleAdaptor VieWResolver
目前都是接口开发:浏览器请求前端控制器(DispatcherServlet)然后查询heandler,找到处理器映射器(HandleMapping)这里是一个key,value,key是映射器value是类名方法名,然后返回给前端控制器返回一个处理器执行链(HandlerExectionChain)。前端控制器再加载处理器适配器(HeadleAdaptor)处理参数和返回值,然后请求处理器(Handler),找到方法上添加了@ResponseBody注解通过HttpMessageConverter来返回结果为Json对象
面试回答
① 用户发送出请求到前端控制器DispatcherServlet
② DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
③ HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet.
④ DispatcherServet调用HandlerAdapter(处理器适配器)
⑤ HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
jsp版本:
⑥ Controller执行完成返回ModelAndView对象
⑦ HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet⑧ DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
⑨ViewReslover解析后返回具体View(视图)
⑩ DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11.DispatcherServlet响应用户
接口版本:
⑥方法上添加了@ResponseBody
⑦ 通过HttpMessageConverter来返回结果转换为JSON并响应
7.springboot自动装配原理
在启动类上有一个非常重要的注解叫做springbootApplication这个注解里面有另外三个注解核心注解
- @SpringBootConfiguration:这个注解和@configuration一样的,用来声明当前启动类是一个配置类
- @EnableAutoConfiguration :Springboot实现自动化配置的核心注解
- @ComponentScan:组件扫描包,默认扫描当前的引导类所在包和他的子包
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})//如果导入了起步依赖就会去找这个起步依赖的配置
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
面试回答:
在springboot启动类上有一个注解叫做springbootapplication,这个注解是对三个朱姐的封装是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
其中@EnableAutoConfiguration是实现自动装配的核心注解。这个注解通过@import注解导入了对应的配置类,内部就是读取了这个项目和这个项目引用的jar包下的文件中所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所制定的条件(起步依赖)来决定是否需要导入到spring容器中。
条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有就加载这些类,把这个配置类中所有Bean都放入到spring容器中
8.spring框架常见的注解
spring中常见的注解
注解 | 说明 |
---|---|
@Component 、@Controller 、@Service 、@Repository |
使用在类上用于实例化 Bean |
@Autowired |
使用在字段上用于根据类型依赖注入 |
@Qualifier |
结合 @Autowired 一起使用,用于根据名称进行依赖注入 |
@Scope |
标注 Bean 的作用范围 |
@Configuration |
指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan |
用于指定 Spring 在初始化容器时要扫描的包 |
@Bean |
使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@Import |
使用 @Import 导入的类会被 Spring 加载到 IOC 容器中 |
@Aspect 、@Before 、@After 、@Around 、@Pointcut |
用于切面编程(AOP) |
springmvc常见注解
注解 | 说明 |
---|---|
@RequestMapping | 用于映射请求路径,可以定义在类上和方法上。用于类上,则表示类中的所有的方法都是以该地址作为父路径 |
@RequestBody | 注解实现接收http请求的json数据,将json转换为java对象 |
@RequestParam | 指定请求参数的名称 |
@PathVariable | 从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数 |
@ResponseBody | 注解实现将controller方法返回对象转化为json对象响应给客户端 |
@RequestHeader | 获取指定的请求头数据 |
@RestController | @Controller + @ResponseBody |
Springboot常见注解
注解 | 说明 |
---|---|
@SpringBootConfiguration | 组合了- @Configuration注解,实现配置文件的功能 |
@EnableAutoConfiguration | 打开自动配置的功能,也可以关闭某个自动配置的选 |
@ComponentScan | Spring组件扫描 |