为什么面试官都喜欢问Spring

Spring面试题目:
Spring是一个容器框架,是个生态,是基石,用来封装JavaBean对象,中间层框架(万能胶),起到一个连接作用,比如Struct和hibernate粘合在一起运用
在这里插入图片描述
在这里插入图片描述

1.spring bean是怎么管理的?
得益于IOC容器,采用注册式单例,始终在map中保持了实例的引用地址
只要IOC容易不被销毁,bean 就永远存在
2.spring中的bean是不是线程安全的?
spring 帮我们做了new 的动作,然后把实例管理起来了

3.Spring的IOC和AOP机制?
IOC: 是一个容器,帮我们管理所有的组件
1)依赖注入,使用@Autowired注解,自动赋值
2)某个组件要使用Spring提供的更多(IOC,AOP),必须加到容器中
体会:
1)容器启动,创建所有单实例bean
2)@Autowired自动装配的时候,是从容器中找到这些bean的
3)ioc.getBean(“aa”)也是从容器中找到这个bean的
4)容器中包括了所有的bean
5)容器就是一个map,这个map中保存了所有创建好的bean,并提供外界获取功能
AOP:
①基于注解的AOP步骤:
a.将目标类和切面类都加入ioc容器中。@component
b.告诉Spring哪个是切面类。@Aspect
c.在切面类中使用5个通知注解来配置切面中的这些方法何时何地运行
d.开启基于注解的aop功能
②基于配置的AOP步骤:

4.Spring中Autowired和Resource关键字的区别?
autowired是spring的注解,通过类型来找bean,按类型找不到就按name找

1)找到一个就赋值;
2)找不到就抛异常;
3)找到多个,就按变量名作为id继续匹配,
   			匹配上就装配,
   			没匹配上就报错。报错原因是因为按变量名作为id继续匹配:
   			可以使用@Qualifier("qq")指定一个新id,找不到就报错,找到就匹配
   			引出@Autowired(required=false),如果找不到就让它允许不被设置,不抛异常

Resource是j2ee的注解,扩展性强,换了一个容器框架也能使用,通过name来找bean

5.依赖注入的方式有几种,各是什么?

1)接口注入
2)构造器注入
3)setter注入

6.Spring容器对Bean组件是如何管理的?
对象的创建,可以使用singleton和prototype
对象的初始化,可以调用init-method指定初始化方法,对于单例的只会在servlet加载的时候初始化
对象的销毁,可以指定销毁方法,destroy-method ,只针对单列模式,prototype不会被管理

7.Spring容器如何创建?

8.Spring事务分类?
1)声明式事务
2)编程式事务
在这里插入图片描述
spring事务只有捕获到异常才会终止或回滚,如果你在程序中try/catch后自己处理异常而没有throw,那么事务将不会终止或回滚,失去事务本来的作用;
spring事务总结:
spring事务本质上使用数据库锁;
spring事务只有在方法执行过程中出现异常才会回滚,并且只回滚数据库相关的操作;

对象锁和spring事务的对比(既然数据库支持事务机制,为什么spring还需要事务支持?):
对象锁可以保证数据一致性和业务逻辑正确性,但不能保证并发性;
spring事务不能严格保证数据一致性和业务逻辑正确性,但具有较好的并发性,因为只锁数据库行数据;
spring事务为什么不能保证数据一致性和业务逻辑正确性:
1)如果事务方法抛异常,此时会回滚数据库操作,但已经执行的其他方法不会回滚,因此无法保证业务逻辑正确性;
2)即使事务方法不抛异常,也不能保证数据一致性(因为事务接口里的数据库操作在整个接口逻辑执行结束后才提交到数据 库,在接口最后提交到数据库的前后很有可能带来数据一致性的问题),从而不能保证业务逻辑正确性;

9.Spring事务的传播特性?(7种)

类型含义
PROPAGATION_required支持当前事务,如果当前没有事务,就新建一个事务
Propagation_supports支持当前事务,如果当前没有事务,就以非事务方式执行
Propagation_mandatory支持当前事务,如果当前没有事务,就抛出异常
Propagation_required_new新建事务,如果当前存在事务,把当前事务挂起
propagation_not_supported以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 当前不支持事务
propagation_never以非事务方式执行,如果当前存在事务,则抛出异常。 不能在事务中运行
propagation_nested

思考:某一个事务嵌套另一个事务的时候怎么办?
A方法调用B方法,AB都有事务,并且传播特性不同,如果A出现异常,B怎么办;B如果出现异常,A怎么办?
总:事务的传播特性指的是不同方法的嵌套调用过程中,事务应该如何进行处理,是用同一个事务还是不同事务,当出现异常时是会回滚还是提交,两个方法之间的相关影响,一般用的较多的是:required,required_new,nested
分:①事务分类:支持当前事务,不支持当前事务,嵌套事务
②③④
核心处理逻辑:
①1.判断内外方法是否是同一个事务:
是:异常统一在外层方法处理
不是:内层方法有可能影响到外层方法,但外层方法不会影响内存方法
总:

10.Spring事务的隔离级别?(5种)
在这里插入图片描述
10.1 Spring事务是如何回滚的?
Spring事务管理是如何实现的?
总: spring事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,正常情况下要通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInterceptpr来实现的,然后调用invoke来实现具体的逻辑
分:
①先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开启新事务
②当需要开启时,获取数据库连接,关闭自动提交功能,开启事务
③执行具体的sql
④在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollback方法来实现的,实现的时候也要获取连接对象,通过连接对象来回滚
⑤如果执行过程中,没有任何意外情况发生,那么通过commitTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过docommit方法来实现的,实现的时候也是要获取连接,通过连接对象来提交
⑥当事务执行完毕之后需要清除相关的事物信息cleanupTransactionInfo
总:
11.Spring的通知类型有哪些?
前置通知 记录日志(方法将被调用)
环绕通知 控制事务 权限控制
后置通知 记录日志(方法已经成功调用)
异常通知 异常处理 控制事务
最终通知 记录日志(方法已经调用,但不一定成功)

12.BeanFactory和ApplicationContext有什么区别?
1)BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
2)①BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
②ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
③相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
3)BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册

13.Spring中支持的bean作用域
1)singlton:在容器中以单例存在
2)prototype:每次调用getBean()就会创建一个
3)request:每次HTTP请求都会创建一个新的Bean。该作用域仅适用于WebApplicationContext环境。
4)session:一个HTTP Session定义一个Bean。该作用域仅适用于WebApplicationContext环境。
5)globalsession:
14.Spring的事务管理器
Spring提供了许多内置事务管理器实现:
1)DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
2)JdoTransactionManager:位于org.springframework.orm.jdo包中,提供对单个javax.jdo.PersistenceManagerFactory事务管理,用于集成JDO框架时的事务管理;
3)JpaTransactionManager:位于org.springframework.orm.jpa包中,提供对单个javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的事务管理;
4)HibernateTransactionManager:位于org.springframework.orm.hibernate3包中,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
15.spring事务不起作用的原因分析:
1)必须是Spring定义(通过XML或注解定义都可以)的Bean才接受事务。
直接new出来的对象添加事务是不起作用的。
2) 入口函数必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。
3)切入点配置错误。
4)如果你使用了springmvc,可能是context:component-scan重复扫描引起的
5)如使用mysql且引擎是MyISAM造成的(因为不支持事务),改成InnoDB即可

16.Spring Ioc的底层实现:

17.Spring AOP的底层实现:
aop是ioc的一个扩展功能,现有的ioc,再有的aop,是在ioc的整个流程中新增的一个扩展点而已:BeanPostProcessor
:aop的概念,应用场景,动态代理
:bean的创建过程中有一个步骤可以对bean进行扩展实现,aop本身是一个扩展功能,所以在BeanPostProcessor的后置处理方法中进行实现:
①代理对象的创建过程(advice,切面,切点)
②通过jdk或cglib的方式生成代理对象
③在执行方法调用的时候,会调用到生成的字节码文件中,直接会找到DynamicAdvisoredInterceptor类中的intercept方法,从此方法开始执行
④根据之前定义好的通知生成拦截器链
⑤从拦截器链中依次获取每一个通知开始进行执行,在执行过程中,为了方便找到下一个通知是哪一个,会有一个cglibMethodInvocation的对象,找的时候从-1的位置依次开始查找并且执行的

==18.Spring 是如何解决循环依赖问题的? ==
三级缓存、提前暴露对象、aop
总: ①什么是循环依赖问题,A依赖B,B依赖A
分: 先说明bean的创建过程,实例化、初始化(填充属性)
①先创建A对象,实例化A对象②③④
总:

SpringMVC框架
1.SpringMVC完整工作流程,熟读源码流程?
在这里插入图片描述
2.SpringMVC如何处理JSON数据?
1)HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息
2)HttpMessageConverter接口定义的方法:
①Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等) ②Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。
③List getSupportMediaTypes():该转换器支持的媒体类型。
④T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
⑤void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
3)DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,
而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
在这里插入图片描述
4)加入 jackson jar 包后, RequestMappingHandlerAdapter
装配的 HttpMessageConverter 如下:
在这里插入图片描述
3.SpringMVC拦截器原理,如何自定义拦截器?
1)Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口,或者可以继承
HandlerInterceptorAdapter 适配器类
①preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
②postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
③afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

4.SpringMVC如何将请求映射定位到方法上面?结合源码阐述?
5.SpringMVC常见注解有哪些?
6.SpringMVC容器和Spring容器的区别?
mvc容器的bean 能访问springioc中的bean,springioc容器的bean 不能访问mvc的。
问题: 若 Spring 的 IOC 容器和 SpringMVC 的 IOC 容器扫描的包有重合的部分, 就会导致有的 bean 会被创建 2 次.
解决:
使 Spring 的 IOC 容器扫描的包和 SpringMVC 的 IOC 容器扫描的包没有重合的部分.
使用 exclude-filter 和 include-filter 子节点来规定只能扫描的注解

7.SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
8.如何启动Spring IOC容器?
非WEB环境:直接在main方法或者是junit测试方法中通过new操作来创建.
WEB 环境:我们希望SpringIOC容器在WEB应用服务器启动时就被创建.
通过监听器来监听ServletContext对象的创建, 监听到ServletContext对象被创建,就创建SpringIOC容器。
并且将容器对象绑定到ServletContext中, 让所有的web组件能共享到IOC容器对象.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值