springboot基础知识(面试)

1.什么是spring?

IOC是一种设计思想,用于实现模块之间的解耦,在Spring中它的作用是对对象的创建,维护和销毁生命周期的控制。IOC:把对象的创建、初始化、销毁等生命周期交给Spring来管理,而不是由开发者,实现了控制反转。

Aop为面向切面编程,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为,切面就是对横切关注点的抽象。

Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。主要包括以下七个模块:

Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring Core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务;
Spring AOP:AOP服务;
Spring Web:提供了基本的面向Web的综合特性,提供对常见框架如Struts2的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
Spring MVC:提供面向Web应用的Model-View-Controller,即MVC实现。
Spring DAO:对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务;
Spring ORM:对现有的ORM框架的支持;

2.对于springboot的理解以及ssm的理解?

Spring boot简化了大量的配置,ssm仍需配置大量的文件。

3.spring 中如何实现事务的?

首先了解什么是事务,事务具有4大特性:
原子性,一致性,持久性,隔离性
原子性:要么全部提交成功,要么全部失败回滚,这就是原子性。
一致性:数据提交后,不能破坏其完整性。一个事务的执行前后数据都应该保持一致。例如,数据库在写入过程中,数据库系统故障,导致写入了一部分,这就是数据不一致了。
持久性:只要事务执行成功,那么数据就应该永久的保留到数据库里,即使数据库故障重启,仍然存在该数据。

隔离性:两个事务并发进行操作同一数据时时,是相互隔离的,互不影响。
其中隔离性又分为4个等级
读未提交:这是隔离等级最低的,即可以读取并行事务下,其他事务修改的过程值,例如事务A和事务B,同时操作同一个数据,A将数据从1加到10,事务B能够读取到2,3,4.……
授权读取:只能读取事务执行完成后的值,例如前面的例子,只能读取事务完成后的值10,否则只能读取数据的初始态1。同时不可重复读。
可重复读:如果事务前后读取的数据是一致的,都为1,则该事务设置的隔离级别是不可重复读和脏读。重复读的隔离级别,有可能会出现幻影数据,即读取的过程中,有可能读取到10,20
串行化:不允许并行,事务只能单独执行即串行,这是隔离的最高级别。

4.设计模式

MVC模式
Model-View-Controller
工厂模式
我们开发中最常用的就是工厂模式,通过传参给统一接口,然后通过判断,来获取相应的子类来实例化
单例模式
只能一个线程进行工作,通常实现需要加锁
例如:一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件

5.面对对象有三大特性和七大原则

三大特性:封装、继承和多态
七大原则:单一职责,开放/关闭,里氏替换,依赖倒转,聚合复用,接口隔离,迪米特原则

6.如何避免多线程死锁?

多个线程同时在等待对方释放锁的时候,由于谁都没办法先释放锁,这个时候程序无法继续往下推进,就产生了死锁。
先列一下死锁的四个必要条件(由于是线程内容,所以以线程为单位):

互斥使用:指某部分资源在被这个线程使用的时候,其他线程无法使用。
不可剥夺:请求资源的线程不能强行从拥有资源的线程手上抢资源,只能等对方主动放弃资源。
请求和保持:拥有资源的线程在不放弃原有资源的情况下又去申请新的资源。
环路等待:存在一个等待队列{T1, T2, T3 … TN},其中T1请求T2的资源,T2又请求T3的资源…直到TN又请求T1的资源,形成一个环路等待队列。

7.spring MVC的流程

1、用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获(捕获);
  2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;(查找handler);
  3、 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller), Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象(执行handler);
  4、DispatcherServlet 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver) (选择ViewResolver);
  5、通过ViewResolver 结合Model和View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回);
快速记忆技巧:
  核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回;

8.如何解决循环依赖

Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。
结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。

简言之,两个池子:一个成品池子,一个半成品池子。能解决循环依赖的前提是:spring开启了allowCircularReferences,那么一个正在被创建的bean才会被放在半成品池子里。在注入bean,向容器获取bean的时候,优先向成品池子要,要不到,再去向半成品池子要。

出现循环依赖一定是你的业务设计有问题。高层业务和底层业务的划分不够清晰,一般,业务的依赖方向一定是无环的,有环的业务,在后续的维护和拓展一定非常鸡肋

构造注入无法解决循环依赖,而spring的三级缓存的存在是的,setter注入不存在循环依赖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值