1.SSM三大框架和SpringBoot有什么区别?

答:SpringBoot是整个Spring技术栈的一个大整合,SpringBoot将原有的xml配置,简化为java注解的形式,而且SpringBoot有内置的tomcat服务器,可以以jar形式启动一个服务,可以快速部署发布web服务,而且使用idea可以很方便的搭建一个SpringBoot项目,选择对应的maven依赖,简化Spring应用的初始搭建以及开发过程,并且SpringBoot使用starter依赖自动完成bean配置,解决bean之间的冲突,并引入相关的jar包。

2.SpringBoot自动配置原理?

答:SpringBoot启动的时候加载主配置类,也就是加载了@SpringBootApplication这个注解,开启了自动配置功能。然后里面有一个@EnableAutoConfiguration这个注解,这个注解主要利用了一个EnableAutoConfigurationImportSelector选择器类给Spring容器中来导入一些组件。然后这个选择器类的父类有一个selectImports方法,这个方法里面有个configurations,并且这个configurations最终会被返回,这个configurations方法的作用就是利用SpringFactoriesLoader.loadFactoryNames从类路径下得到一个资源,它是扫描所有jar包类路径下的META-INF/spring.factories这个文件,把这个文件的urls拿到之后并把这些urls每一个遍历,最终把这些文件整成一个properties对象。然后它从properties对象里边获取一些值,把这些获取到的值来加载我们最终要返回的这个结果,这个结果就是我们要交给Spring容器中的所有组件,这相当于factoryClassName就是我们传过来的Class的这个类名。从properties中获取到EnableAutoConfiguration.class类对应的值,然后把它们添加到容器中。这些值就是很多个AutoConfiguration类,只有这些自动配置类进入到容器中以后,接下来这个自动配置类才开始进行启动。每一个自动配置类进行自动配置功能,有的自动配置类上面有@Conditionalxxx这样的注解,表明满足某个条件配置类才能生效,一旦配置类生效,就是通过@Bean等等给容器中添加组件,组件的属性就是从对应的Properties类中获取的,而这properties类中的每一个属性又是和配置文件绑定的,所以想要修改某些组件的属性直接修改配置文件即可,这就是SpringBoot大致的原理。

面试回答:

SpringBoot启动的时候加载主配置类,也就是加载了@SpringBootApplication这个注解,开启了自动配置功能。然后里面有一个@EnableAutoConfiguration这个注解,这个注解加载了META-INF/spring.factories配置文件中的所有自动配置类,而这些自动配置类都是以AutoConfiguration结尾的,它能从Properties结尾的类中读取全局配置文件中配置的属性如:server.port,Properties类是通过@ConfigurationProperties这个注解与全局配置文件中对应的属性进行绑定的。

3.SpringMVC执行流程?

答:首先前端发起请求,请求前端控制器DispatcherServlet,前端控制器再请求处理器映射器HandlerMapping去查找Handler,找到后向前端控制器返回Handler对象。前端控制器再去调用处理器适配器HandlerAdapter去执行Handler,Handler执行完成后给适配器返回一个ModelAndView对象,适配器再向前端控制器返回ModelAndView对象,前端控制器再去请求视图解析器去进行解析,解析完成后向前端控制器返回View对象,然后前端控制器拿到View对象后进行视图渲染,将模型数据填充到request域,渲染完成后将结果返回给前端。

4.谈谈你对SpringIOC的理解?

答:IOC是控制反转,将手动创建对象的控制权交由Spring框架来管理。将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。使上层控制着下层,使应用解耦。用依赖注入的方式来实现控制反转。依赖注入有三种方式,分别是构造函数注入、setter注入和注解注入。

5.谈谈你对SpringAOP的理解?

答:Spring AOP是面向切面编程,是基于动态代理的。如果被代理的对象实现了某个接口,那么会使用jdk动态代理去创建代理对象,而对于没有实现接口的被代理对象,会使用cglib动态代理,使用一个被代理对象的子类来作为代理对象。

6.Spring中的bean的作用域?

答:singleton单例的,prototype多例的,request作用于web应用的请求范围,session作用于web应用的会话范围,globle_session作用于全局会话范围。

7.Spring中的单例bean的线程安全问题了解吗?

答:就是当多个线程操作同一对象的时候,对这个对象的成员变量的写操作会存在线程安全问题。常见有两种解决办法:1、在类中定义一个ThreadLocal成员变量,将可变成员变量保存在ThreadLocal中。2、改变bean的作用域为prototype,每次请求都会创建一个新的bean实例,自然不会存在线程安全问题。

8.@Component和@Bean的区别是什么?

答:@Component注解用于类,@Bean注解用于方法

9.spring的aop顺序?

答:spring4和spring5的aop执行顺序是不一致的,正常情况下spring4的执行顺序为前置通知,最终通知、后置通知,异常情况下执行顺序为前置通知、最终通知、异常通知。正常情况下spinrg5的执行顺序为前置通知、后置通知、最终通知。异常情况下执行顺序为前置通知、异常通知、最终通知。

10.spring循环依赖?(三级缓存分别是什么?三个Map有什么异同?)

答:spring循环依赖就是对象间相互引用的过程。底层有四大方法和三个map,四大方法分别为getSingleton()、doCreateBean()、populateBean()、addSingleton()。三个map分别为singletonFactories三级缓存表示存放生成bean的工厂,earlySingletonObjects二级缓存存放实例化的bean,singletonObjects一级缓存存放已经经历完整生命周期的bean对象。比如A注入B的同时B也注入A,当实例化A对象的时候,先调用getSingleton()从各级缓存中获取bean,发现都没有,就调用doCreateBean()将它放入到三级缓存里,再调用populateBean()方法进行属性填充发现依赖着B,B就会进行和上述一样的步骤,先getSingleton()发现各级缓存中都没有B,再doCreateBean()把B放到三级缓存里,然后再进行属性填充时发现依赖着A,那么就会调用getSingleton()发现A在三级缓存里,那么就把A放到二级缓存里,并删除三级缓存中的A完成A的实例化,并且将B初始化完成,将B从三级缓存直接放到一级缓存中。接下来继续完成A的属性填充工作,直接从一级缓存中读到了B,则A也初始化完成,将A从二级缓存放到了一级缓存,并删除二级缓存中的A。

更多推荐

SSM与SpringBoot常见面试题汇总