什么是空壳网站,企业营销策划合同,wordpress导出主题,百度优化点击软件目录
前言
1.Spring框架中的单例bean是线程安全的吗?
2.什么是AOP?
3.你们项目中有没有使用到AOP#xff1f;
4.Spring中的事务是如何实现的#xff1f;
5.Spring中事务失效的场景有哪些#xff1f;
6.Spring的bean的生命周期。
7.Spring中的循环引用
8.构造方法…目录
前言
1.Spring框架中的单例bean是线程安全的吗?
2.什么是AOP?
3.你们项目中有没有使用到AOP
4.Spring中的事务是如何实现的
5.Spring中事务失效的场景有哪些
6.Spring的bean的生命周期。
7.Spring中的循环引用
8.构造方法出现了循环依赖怎么解决
9.SpringMVC的执行流程知道嘛
10.Springboot自动配置原理。
11.Spring 的常见注解有哪些
12.SpringMVC常见的注解有哪些
13.Springboot常见注解有哪些
总结 前言
本文主要介绍了Spring面试题相关的面试题目。 1.Spring框架中的单例bean是线程安全的吗?
不是线程安全的Spring框架中有一个Scope注解默认的值就是singleton单例的。因为一般在spring的bean中都是注入无状态的对象没有线程安全问题如果在bean中定义了可修改的成员变量是要考虑线程安全问题的可以使用多例或者加锁来解决。
参考回答不是线程安全的当多用户同时请求一个服务时容器会给每一个请求分配一个线程这时多个线程会并发执行该请求对应的业务逻辑成员方法如果该处理逻辑中有对该单列状态的修改体现为该单例的成员属性则必须考虑线程同步问题。Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。比如: 我们通常在项目中使用的Spring bean都是不可变的状态比如Service类和DAO类所以在某种程度上说Spring的单例bean是线程安全的。如果bean有多种状态的话比如 View Model对象就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由“singleton”变更为“prototype”。
2.什么是AOP?
面向切面编程用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取公共模块复用降低耦合。
参考回答aop是面向切面编程在spring中用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取公共模块复用降低耦合一般可以做为公共日志保存事务处理等。
3.你们项目中有没有使用到AOP
记录操作日志缓存spring实现的事务。核心使用aop中的环绕通知切点表达式(找到要记录日志的方法)通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等)获取到这些参数以后保存到数据库。
4.Spring中的事务是如何实现的
其本质是通过AOP功能对方法前后进行拦截在执行方法之前开启事务在执行完目标方法之后根据执行情况提交或者回滚事务。
5.Spring中事务失效的场景有哪些
异常捕获处理自己处理了异常没有抛出。 解决手动抛出。抛出检查异常Spring 默认只会回滚非检查异常。 解决配置rollbackFor属性为Exception。非public方法导致的事务失效。 解决改为public。
参考回答第一个如果方法上异常捕获处理自己处理了异常没有抛出就会导致事务失效所以一般处理了异常以后别忘了抛出去就行了第二个如果方法抛出检查异常如果报错也会导致事务失效在 spring事务的注解上就是Transactional上配置rollbackFor属性为 Exception这样别管是什么异常都会回滚事务第三如果方法上不是public修饰的也会导致事务失效。
6.Spring的bean的生命周期。
通过BeanDefinition获取bean的定义信息调用构造函数实例化beanbean的依赖注入处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)Bean的后置处理器BeanPostProcessor-前置初始化方法(InitializingBean、init-method)Bean的后置处理器BeanPostProcessor-后置销毁bean
参考回答首先会通过一个非常重要的类叫做BeanDefinition获取bean的定义信息这里面就封装了bean的所有信息比如类的全路径、是否是延迟加载、是否是单例等等这些信息在创建bean的时候第一步是调用构造函数实例化bean第二步是bean的依赖注入比如一些set方法注入像平时开发用的 Autowire都是这一步完成第三步是处理Aware接口如果某一个bean实现了Aware接口就会重写方法执行第四步是bean的后置处理器BeanPostProcessor这个是前置处理器第五步是初始化方法比如实现了接口InitializingBean或者自定义了方法 init-method标签或PostContruct第六步是执行了bean的后置处理器BeanPostProcessor主要是对bean进行增强有可能在这里产生代理对象最后一步是销毁bean。
7.Spring中的循环引用
循环依赖循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A。
循环依赖在spring中是允许存在spring框架依据三级缓存已经解决了大部分的循环依赖。
一级缓存单例池缓存已经经历了完整的生命周期已经初始化完成的bean对象。二级缓存缓存早期的bean对象生命周期还没走完。三级缓存缓存的是ObjectFactory表示对象工厂用来创建某个对象。
具体解决流程
第一先实例A对象同时会创建ObjectFactory对象存入三级缓存singletonFactories第二A在初始化的时候需要B对象这个走B的创建的逻辑第三B实例化完成也会创建ObjectFactory对象存入三级缓存singletonFactories 第四B需要注入A通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存这个是有两种情况一个是可能是A的普通对象另外一个是A的代理对象都可以让ObjectFactory来生产对应的对象这也是三 级缓存的关键 第五B通过从通过二级缓存earlySingletonObjects获得到A的对象后可以正常注入B创建成功存入一级缓存singletonObjects 第六回到A对象初始化因为B对象已经创建完成则可以直接注入BA创建成功存入一次缓存singletonObjects第七二级缓存中的临时对象A清除。
8.构造方法出现了循环依赖怎么解决
A依赖于BB依赖于A注入的方式是构造函数。
原因由于bean的生命周期中构造函数是第一个执行的spring框架并不能解决构造函数的的依赖注入。
解决方案使用Lazy进行懒加载什么时候需要对象再进行bean对象的创建。
参考回答由于bean的生命周期中构造函数是第一个执行的spring框架并不能解决构造函数的的依赖注入可以使用Lazy懒加载什么时候需要对象再进行bean对象的创建。
9.SpringMVC的执行流程知道嘛
视图版本 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping处理器映射器HandlerMapping找到具体的处理器生成处理器对象及处理器拦截器(如果有)再一起返回给DispatcherServlet。DispatcherServlet调用HandlerAdapter处理器适配器HandlerAdapter经过适配调用具体的处理器Handler/ControllerController执行完成返回ModelAndView对象HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServletDispatcherServlet将ModelAndView传给ViewReslover视图解析器ViewReslover解析后返回具体View视图DispatcherServlet根据View进行渲染视图即将模型数据填充至视图中DispatcherServlet响应用户
前后端开发接口开发 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping处理器映射器HandlerMapping找到具体的处理器生成处理器对象及处理器拦截器(如果有)再一起返回给DispatcherServlet。DispatcherServlet调用HandlerAdapter处理器适配器HandlerAdapter经过适配调用具体的处理器Handler/Controller方法上添加了ResponseBody 通过HttpMessageConverter来返回结果转换为JSON并响应
10.Springboot自动配置原理。
在Spring Boot项目中的引导类上有一个注解SpringBootApplication这个注解是对三个注解进行了封装分别是
SpringBootConfigurationEnableAutoConfigurationComponentScan
其中EnableAutoConfiguration是实现自动化配置的核心注解该注解通过Import注解导入对应的配置选择器。 内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
条件判断会有像ConditionalOnClass这样的注解判断是否有对应的class文件如果有则加载该类把这个配置类的所有的Bean放入spring容器中使用。
11.Spring 的常见注解有哪些 参考回答第一类声明bean有Component、Service、Repository、Controller 第二类依赖注入相关的有Autowired、Qualifier、Resourse第三类设置作用域 Scope第四类spring配置相关的比如ConfigurationComponentScan 和 Bean第五类跟aop相关做增强的注解 AspectBeforeAfter AroundPointcut。
12.SpringMVC常见的注解有哪些 参考回答有RequestMapping用于映射请求路径 RequestBody注解实现接收http请求的json数据将json转换为java对 象 RequestParam指定请求参数的名称 PathViriable从请求路径下中获取请求参数(/user/{id})传递给方法的 形式参数ResponseBody注解实现将controller方法返回对象转化为json 对象响应给客户端RequestHeader获取指定的请求头数据还有像 PostMapping、GetMapping这些。
13.Springboot常见注解有哪些 参考回答Spring Boot的核心注解是SpringBootApplication 它由几个注解组成SpringBootConfiguration 组合了Configuration注解实现配置文件的功 能 EnableAutoConfiguration打开自动配置的功能也可以关闭某个自动配置的选项 ComponentScanSpring组件扫描。 总结
本文主要介绍了Spring相关的面试题目。