面试--spring

spring是什么

spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

对AOP的理解
AOP:将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。AOP可以对某个对象或者某些对象功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一下事情。

对IOC的理解
容器概念,控制反转,依赖注入
ioc容器:实际上就是个Map(key,value),里面存的是各种对象(在xml里配置的bean节点,@repository、@service、@controller、@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放在map里,扫描到上述注解的类还是通过反射创建对象放到map里。
这时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,再通过DI注入(autowired、resource等注解,xml里bean节点内的ref属性,项目启动的时候会读取xml节点ref属性根据id注入,也会扫描这些注解,根据类型或id注入;id就是对象名)。
控制反转
以前对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建B还是使用B,主动权都在A的手里。
引入IOC容器之后,对象A与对象B失去了直接的联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

BeanFactory和ApplicationContext有什么区别

ApplicationContext是BeanFactory的子接口。增强功能

  1. 继承MessageSource,因此支持国际化。
  2. 统一的资源文件访问方式
  3. 提供在监听器中注册bean的事件
  4. 同时加载多个配置文件
  5. 载入多个上下文。
    beanFactory采用的是延时加载的形式来注入bean,如果bean有异常,需要在第一次使用调用getBean方法才会抛出异常

applicationContext 启动容器是,一次性创建所以的Bean。

beanFactory通常以编程的方式被创建,applicationContext还能以声明的方式创建。
都支持beanPostProcessor、beanFactoryPostProcessor的使用,但是
beanFactory需要手动注册,ApplicationContext则是自动注册

springBean的生命周期

  1. 解析类得到beandefinition
  2. 如果有多个构造方法,则要推断构造方法
  3. 确定好构造方法后,进行实例化得到一个对象
  4. 对对象中的加@Autowired注解的属性进行属性填充
  5. 回调Aware方法,比如BeanNameAware,BeanFactoryAware
  6. 调用BeanPostProcessor的初始化前的方法
  7. 调用初始化
  8. 调用beanPostProcessor的方法,在这里会进行AOP
  9. 如果当前创建的bean是单例的则会把bean放入单例池
    10.使用bean
  10. spring容器关闭时调用DisposableBean中destory方法。

几种Bean的作用域

  • singleton 单例在容器中只有一个实例
  • prototype 每一个bean请求提供一个实例
  • request bean被定义为在每个http请求中创建一个单例对象,也就是说在单个请求中都会复用这个单例对象。
  • session 与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
  • application bean被定义为在servletContext的生命周期中复用单例对象。
  • websocket bean被定义在websocket的生命周期复用一个单例对象。

spring框架中都用了哪些设计模式
简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪个产品类。
beanFactory 就是简单工厂的体现。

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点

适配器模式:
spring定义一个适配器接口,使得每一种controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展controller时,只需要增加一个适配器就完成了springMVC的扩展了。

装饰模式:动态的给一个对象添加一下额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类中含有Decorator。

动态代理:AOP

观察者模式
spring的事件驱动模型使用的是 观察者模式,spring中Observer模式常用的地方是listener的实现。

策略模式:
spring框架的资源访问Resource接口,该接口提供了更强的资源访问能力,spring框架本身大量使用了Resource接口来访问底层资源。

Spring事务的实现方式和原理以及隔离级别

@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用

在使用spring框架时,可以有两种使用事务的方式,一种是编程试的,一种是申明式,@Transaction注解就是申明式的。

首先,事务这个概念是数据库层面的,spring只是基于数据库中的事务进行了扩展,以及提供了一些能让程序员更加方便操作事务的方式。

比如我们可以通过再某个方法上增加@Transaction注解,就可以开启事务,这个方法中所以的sql都会在一个事务中执行,统一成功或者失败。

在一个方法上加了@Transaction注解后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当在使用这个代理对象的方法时,如果这个方法上存在@Transaction注解,那么代理逻辑会先把事务的自动提交设置为fase,然后再去执行原本的业务逻辑方法,如果执行逻辑方法没有异常,那么代理逻辑中就会将事务进行提交,如果执行业务逻辑方法出现异常,那么则将事务进行回滚。

当然,针对哪些异常回滚事务是可以配置的,可以利用@Transaction注解中的rollbackFor属性进行配置,默认情况下会对RuntimeException和Error进行回滚。

spring事务隔离级别就是数据库的隔离级别,外加一个默认隔离级别

read uncommitted (未提交读)
read committed (提交读)
repeatable (可重复读)
serializable (串行)
数据库的配置隔离级别是Read Committed,而spring 配置的隔离级别是Repeatable Read。以spring配置为准,如果spring配置的隔离级别数据库不支持,效果取决数据库

spring事务传播机制

多个事务方法相互调用,事务如何传播。

@Transactional(propagation=Propagation.REQUIRED)

REQUIRED 默认传播事务,如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。
SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行。
MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常
REQUIRS_NEW:创建一个新事务,如果存在当前事务,则挂起该事务。
NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务
NEVER:不使用事务,如果当前事务存在,则抛出异常
NESTED:如果当前事务存在,则嵌套事务中执行,否则REQUIRED的操作一样

REQUIRES_NEW是新建一个事务并且新开启的这个事务与原事务无关,而NESRED则是当前存在事务时(我们把当前事务称之为父事务),会开启一个嵌套事务(子事务),在NESRED情况下父事务回滚时,子事务也会回滚,而在REQUIRES_NEW情况下,原有事务回滚,不会影响新开启的事务。

REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一事务,那么被调用方出现异常时,由于共用一个事务,所以无论调用方是否catch其异常,事务都会回滚 而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不受影响。

spring事务失效

spring事务的原理是AOP,进行了切面增强,那么失效的根本原因时这个AOP不起作用了,常见情况有如下几种
1、发生自调用,类里面使用this调用本类的方法,此时这个this对象不受代理类,而是UserService对象本身
解决:让那个this变成UserService的代理类即可。
在这里插入图片描述

在这里插入图片描述

2、方法不是public
@Transaction只能用于public的方法上,否则事务不会失效,如果要用在非public方法上,可以开启AspectJ代理模式。
3、数据库不支持事务
4、没有被spring管理
5、异常被吃掉,事务不会回滚

什么是bean的自动装配,有哪些方式
开启自动装配

    <bean id="cutomer" clase="x.x.x.x.x" autowire="">

byName,byType,constructor,autodetect.

spring boot、spring和spring MVC的区别

spring是IOC容器,用来管理bean,用依赖注入实现控制反正,可以方便的整合框架。提供AOP机制,方便将不同类不同方法中的共同处理抽取成切面,自动注入给方法执行,比如日志、异常。

springmvc是spring对web框架的一个解决方案,提供了一个总的前端控制器servlet,用来接收请求。定义了一套路由策略(url到handle的映射)以及适配执行handle,将handle结果使用视图解析技术生产视图展现给前端。

springboot是spring提供了一个快速开发工具包,让程序员更方便,更快捷的开发spring+springmvc应用,简化了配置,整合了一系列的解决框架,redis,es 可以开箱即用。

springMVC工作流程

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandleMapping处理器映射器。<rul,到handler的映射>
  3. 处理器映射器找到具体处理器(可以根据xml配置、注销进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet调用HandleAdapter处理器适配器。
  5. HandleAdapter经过适配器调用具体的处理器(Controller,也叫空端控制器)
  6. Controller执行完成返回ModeAndView。
  7. HandlerAdapter将controller执行结果ModeAndView返回给DispatcherServlet,DispatcherServlet将ModeAndView传给ViewReslover视图解析器
  8. ViewReslover解析后返回具体view
  9. DispatcherServlet根据View进行渲染视图
    10.DispatcherServlet影响用户
    在这里插入图片描述
    springboot自动配置原理

自动配置类由各个starter提供,使用@Configuration+@Bean定义配置类,放在META-INF/spring.factories下

使用spring spi扫描META-INF/spring.factories下的配置类

使用@Import导入自动配置类
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值