最近准备换工作,将面试的问题总结总结,如果有什么问题请多多见谅,希望可以指点出来,如果可以补充不足那就更好了。
- spring是什么:轻量级的ioc与aop框架,简化了企业应用开发。常见的配置:XML配置 注解的配置
- Spring优点:低侵入,降低代码的耦合,aop技术提高代码的复用,主流应用框架支持集成配置。
- Spring AOP理解:AOP是面向对象的补充,将一些对业务无关的代码,但有其他作用的公共代码给抽取出来,封装成可以复用的切面。减少了重复代码。例如:日志,事务等等
- AOP的动态代理:
Cglib:代理的类可以没有接口,会为代理的类生成一个子类,这个子类就是代理对象(被final修饰的类与方法不可以被代理);
Jdk动态代理:代理的类必须要有接口(默认使用); - AOP实现:
- AOP的原理也就是动态代理,动态代理也就是 真实实现类与代理类。那我们在要使用这个类的时候我们把代理类返回去就可以了。而spring 的ioc容器管理了所有的bean,如果要创建实例 那么用getBean就可以返回这个bean的实例。所以aop是依赖于ioc容器的。
- Bean 的生命周期是 实例化——>属性注入——>aware注入——>postProcessBeforeInitialization——>init——>postProcessAfterInitialization。而创建代理的过程就是在postProcessAfterInitialization方法中执行的,会用动态代理创建一个全新的bean,返回出去;
6. IOC的理解:创建对象的控制权交给了spring容器,对象与对象之间的松耦合。DI则是spring将IOC容器中的对象注入到所需要的地方。
7. IOC的实现:通过反射来创建的。
8. Spring容器的三级缓存:三级缓存主要是为了解决循环依赖。属性的循环依赖spring可以解决,构造器的循环依赖spring解决不了。
- 三级缓存分别存储的是:bean创建完成,实例化后属性未注入,bean的factory(FactoryBean)。
- 获取一个bean对象,会首先从缓存中获取,如果缓存中存在,那么使用缓存的实例,不存在才会去创建。创建的时候实例化后,会判断是否允许提前暴露,如果允许提前暴露会将对象加入到三级缓存内,也就是bean的factory中。在进行属性注入的时候,如果有依赖其他对象,会通过getBean在继续往下进行。
9. Spring bean的生命周期:
实例化——>属性注入——>aware注入——>postProcessBeforeInitialization——>init— —>postProcessAfterInitialization——>destory
10. servlet生命周期:实例化——>init 初始化——>sevices处理请求——>destory 销毁
11. Spring bean的作用域:
- Singleton 单例 默认
- Prototype 每次请求创建
- Request
- Session
- GloBal-session
12. spring注入:
- Autowired 默认按照类型注入 要求接口只可以有一个实现类
- Resource 默认按名称注入,名称找不到按照类型注入
13.
- Spring的事务:
- Spring的事务支持 编程式事务 与 声明式事务
- Spring的事务传播行为:
- Required 如果当前没有事务,创建一个新事务,如果有事务,加入到这个事务内
- Suppors 如果有事务,加入到事务内。没有事务,以无事务执行
- Mandatory 如果有事务,加入事务。没有事务,报错
- Requires_new 创建一个新事物
- Not_suppors 以无事务执行,有事务 挂起事务
- Never 以非事务方式执行,有事务,报错
- Nested 嵌套事务执行,如果没有事务创建一个新事务
14. Spring的隔离机制:
- 数据库默认隔离机制
- 读未提交 脏读
- 读已提交 不可重复度
- 可重复读 幻读
- 串行
15. Servlet, filter, listener初始化顺序:Listener ——> filter——> servlet
16. SpringMvc 启动与初始化流程:dispatcherServlet他的父级继承了httpServlet,所以他也就是一个servlet,servlet启动的时候会执行init初始化方法。也就在httpServletBean中。这里会初始化上下文加载容器,也就是webApplicaationContext,也就会初始化springMvc的9大组件,比如handlerMapper, handlerAdapters, ViewResolvers等
17. SpringMvc调用流程:当请求进来,首先进入到dispatchServlet中,会根据请求路径找到对应的handler,handler默认是有beanNameUrlHandlerMapper,requestMapperHandlerMapper 而requerMapper注解对应的 handlerMapper就是requestMapperHandlerMapper。在根据handler找到对应的适配器,handlerAdapters 作用也就是调用controller中的方法,会有参数,也就是将url的参数转换为方法的入参。最后返回modelAndView,经过视图解析器,解析视图渲染数据
18.Spring中常用注解:
@Service @Controller @RequestMapper @Autowired @Resource @Bean @Component
@Configuration @ResponBody @RequestBody @RequestParam
19. SpringMvc 接收入参方式:
- @RequestParam:接收参数类型为 application/x-www-form-urlencoded
- @PathVariable: 从Url路径读取参数
- SpringMvc 自动匹配,请求参数名跟方法入参名一样
- SpringMvc自动装箱,实体类接收参数
- @RequsetBody: 接收类型为application/json 参数是json