spring 面试问题总结

spring 有哪些主要模块?

1、Spring Core

Core模块是Spring的核心类库, Core主要实现IOC功能。

2、AOP

拦截器,事务,日志

3、ORM

Hibernate,ibtas,myBtas,JDBC,Spring本身并不对ORM进行实现,仅对提供接口

4、DAO模块

Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。

5、WEB模块

WEB常见框架如Struts1,web,Servlet

6、Context模块

Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。

7、MVC模块

Struts,SpringMVC框架。

spring怎么判断两种代理模式:

如果目标类是一个接口或者是 Proxy 的子类 则还是使用 JDK 动态代理,否则使用cglib代理

Bean的创建过程

 1new AnnotationConfigApplicationContext,首先会 new AbstractApplicationContext 设置启动参数 和创建资源解析器

再会 new GenericApplicationContext 创建DefaultListableBeanFactory 

2this 方法:1创建一个AnnotatedBeanDefinitionReader对象 ,根据类解析并创建BeanDefinition

创建一个ClassPathBeanDefinitionScanner对象,根据包路径读取类,创建BeanDefinition

 register 解析bean并创建BeanDefinition

(1)BeanDefinition:beanClass,propertyValues,lazy ,scope,initMethod ,destroyMethod ,qualifiers等bean 信息。

四 refresh方法

finishBeanFactoryInitialization 初始化所有剩下的单实例 Bean除赖加载的 lazy=true, lazy是再次获取bean的时候实例化的

getBean->doGetBean->getSingleton->

先从一级缓存获取,再从二级缓存获取,再从三级缓存获取,获取不到createBean,创建一个Factory对象保存到三级缓存中在填充属性时候检查存在循环依赖的bean,通过getEarlyBeanReference创建对象。 在删除三级缓存,对象保存到二级缓存, 最后通过singletonFactory.getObject()函数一直递, 保存到一级缓存,删除二,三级缓存

DefaultSingletonBeanRegistry

singletonObjects 一级缓存,earlySingletonObjects 二级缓存,singletonFactories三级缓存

spring 为啥需要三级缓存?

首先明确aop的实现是通过 postBeanProcess后置处理器,在初始化之后做代理操作的

例: a依赖b,b依赖a,同时a,b都被aop增强。

如果只使用二级缓存

三级缓存是singletonFactory不是我们要的bean,二级缓存或一级级缓存才会实例化bean

这个时候a在设置属性的过程中去获取b(这个时候a还没有被aop的后置处理器增强),

创建b的过程中,b依赖a,b去缓存中拿a拿到的是没有经过代理的a

AOP使用场景:

Authentication 权限

Error handling 错误处理

Lazy loading 懒加载

Transactions 事务

log 日志

方面(Aspect):切面类。

连接点(Joinpoint):  程序执行过程中明确的点,一般是方法的调用。

通知(Advice)大多用于日志、缓存。:  前置通知(@Before):logStart:在目标方法(div)运行之前运行

              后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)

              返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行

              异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行

              环绕通知(@Around:动态代理,手动推进目标方法运行

切入点(Pointcut):  Spring定义了Pointcut接口,用来组合Method(妈则的)Matcher和ClassFilter,

MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

引入(Introduction): 添加方法或字段到被通知的类,通过动态代理实现给匹配到的类,增加父类

织入(Weaving): 创建代理对象前和后可以增加,方法

advisor=切面(advice)+切入点(PointCut),advisor大多用于事务管理

 Spring事务管理

编程式事务管理: 通过Transaction Template手动管理事务

声明式事务: 是建立在AOP之上的。其本质是对方法前后进行拦截,

Spring事务传播机制

Sring没有提供任何事务支持,对外提供统一的编程API。

Spring事务的核心是PlatformTransactionManager接口,可以代表任何事务,包括JDBC事务,Hibernate事务,甚至是JTA事务(全局事务)。

PlatformTransactionManager :它提供开始事务getTransaction(),提交事务commit()和回滚事务rollback()这三个方法

TransactionDefinition :getPropagationBehavior();//返回事务的传播行为,getIsolationLevel();//返回事务的隔离级别, getTimeout();//返回事务必须在多少秒内完成, isReadOnly();//事务是否只读,

定义五个隔离级别:

1) DEFAULT (默认)这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

2) READ_UNCOMMITTED (读未提交)这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的

数据。这种隔离级别会产生脏读,不可重复读和幻像读。

3) READ_COMMITTED (读已提交)保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能

读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

4) REPEATABLE_READ (可重复读)这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像

读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

5) SERIALIZABLE(串行化)这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

七个事务传播行为:

(1) required 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

(2)supports如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

(3) mandatory 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

(4)REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

(5)NOT_SUPPORTED  总是非事务地执行,并挂起任何存在的事务。

(6)never总是非事务地执行,如果存在一个活动事务,则抛出异常;

(7)nested如果一个活动的事务存在则运行在一个嵌套的事务中. 如果没有活动事务, 则按 REQUIRED 执行。

Spring事务失效的场景

1不是public 或者Final方法,不能被子类重写,2不是代理对象,3方法内部调用。

4Transactional注解方法抛出的异常不是Spring 事务支持的异常,可以手动指定RollbackFor 5多线程调用,两个不同线程拿到的数据连接是不一样的。所以是两个不同事物

SpringMVC

1、客户端发出一个http请求给web服务器,web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)mapping 到处理请求的处理器(Handler)。匹配controller及方法填充参数

5、Controller执行完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

spring 事务锁?

spring事务在执行方法之前开启事务,上锁执行业务代码,解锁提交事务。

第一个线程解锁后还没提交事务,第二个线程就开启事务上锁这个时候读取的数据不是最新的。

解决方案:1把同步锁抽取到controller层

2将分布式锁替换数据库锁,for update 或者版本号

springBoot

Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置

嵌入式Tomcat、Jetty、 Undertow容器(无需部署war文件)。

提供的starters 简化构建配置

尽可能自动配置spring应用。

创建独立的 spring 应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值