面试题《Spring》

Spring是什么?

Spring是一个轻量级的IOC/AOP容器框架。常见的配置方式:基于xml配置,基于注解配置,基于Java配置。

AOP

OOP面向对象,定义了纵向的关系,并没有定义横向关系,导致了大量的代码重复,不利于各个模块的重用。

AOP,称为面向切面,是面向对象的一种补充。

用于将那些与业务无关,但对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被称为切面。

好处是:减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

AOP实现的关键在于代理模式

代理模式是一种结构型设计模式,代理对象将被代理对象包装一层,做一些额外的工作。

为了保持行为的一致性,代理类和委托类通常会实现相同的接口。

通过代理类这一层中间件,能有效的控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同策略预留了空间。

代理作为委托类,可进行预处理消息,过滤消息,转发消息以及消息被委托类执行后的后续处理。

按照代理的创建时间,代理可以分为两种:静态代理(由程序员创建代理类再对其进行编译)和动态代理(在程序运行时运用反射机制动态创建而成)

静态代理缺点:

  1. 代理类和委托类都需要实现相同的接口,这样就出现了大量的代码重复(由于均实现同样的方法逻辑);如果接口增加了方法,所有的实现类和委托类都需要实现此方法,增加了代码的维护难度。
  2. 代理对象只服务于一种类型对象,如果要服务于多种类型对象,则需要为每一种对象创建代理,这样在程序规模稍大时,静态代理就无法胜任(大量的维护及大量的冗余代码)。例如打印日志

静态代理是在编译期就已经确定了要代理的对象,而动态代理是在运行时,通过反射机制来生成代理对象,这个对象包含了目标对象的全部方法,并做了增强处理,并且能够代理多种对象。

jdk动态代理:只支持接口的代理。代理类需实现InvocationHandler接口,实现invoke()方法。invoke()方法是调用被代理接口的所有方法时需调用的。构造方法需要传入目标对象(被代理接口的具体实现类),根据传入的目标对象返回一个代理对象(Proxy.newProxyInstance())。(利用拦截器:实现InvocationHandler接口,加上反射机制,生成一个实现代理接口匿名类)

根据传入不同的目标对象,就可生成不用的代理类,进而对不同对象进行功能委托

cglib动态代理:对代理对象类的class文件加载进来,通过修改其子节码生成子类来处理

如果目标对象实现了接口,默认使用jdk动态代理;但是也可以强制使用CGLIB实现动态代理。

如果目标对象未实现接口,必须采用CGLIB。

如何强制使用?在spring的配置文件中加入:<aop:aspectj-autoproxy proxy-target-class="true"/>

https://blog.csdn.net/yhl_jxy/article/details/80635012

AOP名词

切面(Aspect):被抽取的公共模块,用来横切多个对象,在普通类中以注解@AspectJ来实现

切入点(Pointcut):通过切入点表达式指定拦截方法(具体切入的方法)

连接点(Join Point):具体的切入点,就是连接点

通知(Advice):连接到切入点后要执行的操作

  1. 前置通知(在连接点之前执行的通知,不能阻止连接点的执行)
  2. 返回后通知(在连接点正常执行后的通知)
  3. 抛出异常后通知(在方法抛出异常退出时执行的通知)
  4. 后通知(连接点退出后执行的通知,无论是否有异常)
  5. 环绕通知(包围一个连接点的通知)

目标对象(Target Object):被一个切面或多个切面所通知的对象

IOC/DI

IOC就是控制反转,指创建对象的控制权的转移,交由spring容器控制。

Spring容器根据配置文件,通过Java反射机制,在运行时动态创建对象并管理各个实例之间的依赖关系。这样对象之间松散耦合,利于复用。

DI是依赖注入,是控制反转概念不同角度的描述。指的是在运行时依赖IOC容器来动态注入对象所需的资源。

IOC有三种注入方式:构造器注入,setter注入,注解注入

BeanFactory与ApplicationContext区别

都是Spring容器,其中ApplicationContext是BeanFactory的子接口。

BeanFactory采用的是延迟加载形式加载Bean。即只有使用到Bean(getBean)时,才会对Bean进行实例化。

延迟加载有缺点:如果spring配置有问题(某个Bean参数缺失),只有直至第一次调用该Bean时才会抛出异常

ApplicationContext是在容器启动时,一次性创建了所有Bean。这样就可以在启动时就能发现配置是否有误。

Bean作用域

  1. singleton:默认,单例
  2. prototype:多例,每个bean请求将会创建一个bean
  3. request:每一个网络请求将会创建一个bean,请求完成后bean会失效,并被垃圾回收器回收
  4. session:每个session创建一个bean,session过期后,bean失效,并被垃圾回收器回收
  5. global-session:全局作用域

spring中单例的bean是线程安全的吗

Spring框架并没有对单例bean进行任何多线程的封装处理。

关于单例bean的线程安全和并发问题需要开发者自行去搞定。

但实际上,大部分的Spring bean并没有可变的状态(比如Servies类和DAO类,没有共享属性),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象,就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

Spring如何处理线程并发问题?

一般情况下,只有无状态的Bean才可以在多线程环境下共享。

ThreadLocal和线程同步机制都是为了结局多线程中相同变量的访问冲突问题。

同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获取到锁的线程需排队。

ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步。

Spring自动装配

通过类型,通过名称

@Autowired默认是按照类型装配注入,默认要求依赖对象必须存在(也可设置为false)

@Resource默认是按照名称装配注入,找不到名次才会按照类型进行装配

Spring框架中使用了哪些设计模式?

  1. 工厂模式:BeanFactory简单工厂模式的体现,用来创建对象的实例
  2. 单例模式:Bean默认为单例模式
  3. 代理模式:AOP功能使用到了jdk与cglib动态代理
  4. 模板方法
  5. 观察者模式

Spring事务实现方式及原理

Spring事务到本质是数据库对事务的支持,没有数据库事务的支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚,是通过binlog或redo log实现的。

1、spring事务种类

编程式事务:TransactionTemplate

声明式事务:建立在AOP之上。本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截到方法中。也就是在目标方法之前,加入一个事务,在执行完目标方法之后,根据执行情况提交或回滚事务。

    优点:在业务逻辑代码中未掺杂事务管理的代码,只需要加入@Transaction注解或在配置文件中做相关事务的规则声明,便可以将事务规则应用到业务逻辑中。

   唯一不足是,最细粒度只能到方法级别。

2、spring事务的传播行为

  1. REQUIRED:如果当前没有事务就创建一个新的事务;如果当前存在事务,就加入该事务。
  2. SUPPORTS:支持当前事务。如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
  3. MANDATORY:支持当前事务。如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
  4. REQUIRED_NEW:创建新事务。无论当前是否存在事务,都创建新事务。
  5. NOT_SUPPORTS:以非事务方式执行。如果当前存在事务,就把当前事务挂起。
  6. NEVER:以非事务方式运行。如果当前存在事务,则抛出异常。
  7. NESTED:如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,则按照REQUIRED事务执行。

3、spring的隔离级别

  1. DEFAULT:默认隔离级别。使用数据库默认的事务隔离级别。
  2. READ_UNCOMMITTED:读未提交,允许另一个事务可以看到这个事务未提交的数据。
  3. READ_COMMITTED:读已提交,保证一个事务修改的数据提交后,才能被另一个事务读取,而且能够看到该事务对已有记录的更新。
  4. REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后,才能被另一个事务读取,但是不能够看到该事务对已有记录的更新。
  5. SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。

 

以下基本不会被面到

核心模块

Spring Core【核心类库,提供IOC服务】 Spring Context【提供框架Bean访问方式】 Spring AOP【提供AOP服务】

Spring Dao【对JDBC的抽象,简化了数据访问异常处理】 Spring ORM【对现有ORM框架的支持】

Spring WEB【提供了基本面向web的综合特征】 Spring MVC【提供面向Web应用的Model-View-Controller实现】

spring优点

  1. spring属于低侵入式设计,代码的污染低
  2. spring的DI机制将对象之间的依赖关系交由框架处理,减低组件之间的耦合性
  3. spring提供了aop技术,支持一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而更好的复用
  4. spring对主流应用框架提供了集成支持

原文地址

https://blog.csdn.net/a745233700/article/details/80959716

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值