第一章 spring
1.什么是spring/发展历程
- 2004推出spring1.0(注解驱动的启蒙时代)
- 2006年推出spring2.0(注解驱动过度的时期)
- 一些注解现在都还在用比如
- controller
- component
- service
- requestmapping
- 2009推出spring3.0(注解驱动的黄金时代)
- configuration
- importResource
- componentscan
- 2013推出spring4.0(注解驱动完善时代)-springboot1.0
- 2017推出spring5.0(注解驱动的成熟时代)-springboot2.0
- indexed 提升componentscan效率
- 2022年推出spring6.0
2.spring的组成
主要部分
- core
- context
- aop
- dao
- orm
- web
- mvc
- 提供面向web应用的 model-view-controller实现
3.spring框架中哪些设计模式
- 单例模式
- spring中最明显的单例应用场景就是在配置文件中配置注册bean对象的时候设置scope的值为singleton
- 模版方法
- spring中的refresh方法,把创建容器初始化的过程都约定好了
- jdbc的模版工具
- 观察者模式
- 工厂模式
- 适配器
- 在aop的实现,mybaties有个日志模块,对于适配器很方便。
- 代理模式
- 策略模式
- 责任链模式
4.autowired和resource关键字的区别
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
- 注入方式
- @Autowired只按照byType 注入;
- @Resource默认按byName自动注入
5.spring中常用的注解有哪些?[需要加源码解析]
- controller
- service
- restcontroller
- componentscan
- configuration
- import
6.spring循环依赖/如何解决循环依赖问题
三级缓存
当我们需要获取bean的时候,spring会先去一级缓存里面取/二/,如果都没有的话呢,会创建一个工厂对象,从工厂对象去实例化bean,当我们属性注入过后呢,spring会把他放到二级缓存,然后马上执行初始化方法,初始化过后的方法呢,存在一级缓存。
7.谈谈spring ioc的理解,原理以及实现
- 控制反转
- 是一个理论思想
- 原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们管理
- di:依赖注入
- 把对应的属性的值注入到具体的对象中,在spring中比如可以通过@autowired,完成属性值的注入
- 容器
- 存放具体的存储对象,使用map结构来存储,在sprin中一般存在三级缓存,singletonObject存放完成的bean对象,整个bean的生命周期从创建到使用-销毁的过程全部都是由容器管理的。
8.bean的生命周期
https://blog.csdn.net/kxkxyzyz/article/details/105817176?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-105817176-blog-125286156.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-105817176-blog-125286156.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=8
-
- 首先进入refresh();
-
- beanfactoryInitialization初始化所有单例对象
-
- preInstantiateSingletons处理所有的单例对象
-
- 调用getbean,dogetbean先查询该对象有被初始化过
-
- 通过createBean,doCreateBean,createBeanInstance,以反射的方式创建对象,一般使用的无参构造方法(newInstance)
-
- popualteBean给对象set方法负值
-
- InitializeBean对bean进行初始化
-
- 调用beanPostProcessor前置方法(前置创建代理类)
-
- 调用initmethod方法
-
- 调用beanPostProcessor中的后置方法:【没有做任何事情】(spring 的aop就是在此处实现的)
-
- 销毁流程
- 判断是否实现了dispoablebean接口,调用destoryMethod方法
9.谈谈spring aop的理解,原理以及实现
aop是ioc的扩展功能,先有的ioc,再有的aop,aop只是ioc的流程中的一个扩展点。beanPostProcessor,
aop概念,应用场景,动态代理,
- 首先启动SpringAop时,会使用该@EnableAspectJAutoProxy注解
- 将@Import(AspectJAutoProxyRegistrar.class)注入SpringIOC容器中
- AspectJAutoProxyRegistrar中会注册对象
BeanId:org.springframework.aop.config.internalAutoProxyCreator
BeanClass :AnnotationAwareAspectJAutoProxyCreator
- AnnotationAwareAspectJAutoProxyCreator最为核心:使用后置通知在bean的对象初始化的时候,实现对代理对象的增强。
AnnotationAwareAspectJAutoProxyCreator祖宗:
AbstractAutoProxyCreator 祖宗有是BeanPostProcessor
- 被代理对象在初始化的时候,AbstractAutoProxyCreator 经过这样的一个类拦截。
判断该被代理对象是否有被有实现过接口,如果有实现过接口就使用jdk动态代理,如果没有实现接口则使用cglib动态代理。
10.谈谈spring的事物如何回滚的
spring的事物是由aop来实现的,首先要生成具体的代理的对象,按照aop的流程执行具体的逻辑
先做准备工作,解析各个方法上事物相关的属性,根据具体的属性来判断是否开启新事物,当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事物,执行具体的sql逻辑操作,在操作过程中,如果执行失败,那么会通过afterThroing进行回滚操作,回滚的具体逻辑是通过dorollback实现的。获取连接,执行jdbc的rollback
11.谈谈spring的事物传播/传播特性有几种?
事物的不同分类:支持当前事物,不支持当前事物,嵌套事物。
判断内外方法是否是同一个事物:是,异常同意在外层方法处理,不是:内层方法由可能影响到外层方法,但是外层方法是不影响内层方法,大致是这样的。
7种
工作中使用最多的(
required
requires_new
nested
)
support
not_support
never
mandatory
12.bean factory 与 factorybean
都是创建bean对象的
不同bean factory必须严格遵循流程,如果向简单自定义一个那就要实现factorybean
13.bean factory 与 applicationContext之别是什么?
applicationContext其实是对bean factory扩展,
继承bean factory,增强了一些功能(比如国际化,资源访问,事件传递aware,常用获取applicationContext的方法(文件,注解))
补充
1.jdk/cjlib区别
(1)JDK动态代理
- 要求目标对象必须实现一个接口
(2)CGLIB是针对类实现代理,
- 主要是对指定的类生成一个子类,覆盖其中的方法,继承来实现代理的,无法对final,private和static方法进行代理
第二章 springmvc
1.springmvc的执行流程
首先请求会到核心控制器dispatcherServlet,dispatcherServlet会判断请求后缀是否满足格式要求,如果满足格式要求,会查询handlerMapping,查找对应的handler,调用handlerAdapter进行参数的绑定适配工作,之后调用具体的handler处理业务逻辑,返回一个modelandview进行视图解析返回给客户端。
第三章 mybatis
1.mybatis的执行sql的过程
- 构建SqlSessionFactory对象
- 创建并初始化SqlSession对象(数据库会话)
- 创建Executor对象
- Executor是对JDBC的封装。当我们使用JDBC来执行sql时,一般会先预处理sql,也就是conn.prepareStatement(sql),获取返回的PreparedStatement对象(实现了Statement接口),再调用statement的executeXxx()来执行sql
- ParameterHandler的功能就是sql预处理后,进行设置参数
- 通过Executor来执行sql
- 在MyBatis,也是调用Statement.executeXxx()来执行sql
-
- 对sql进行预处理;
-
- 调用statement.executeXxx()执行sql;
-
- 将数据库返回的结果集进行对象转换(ORM);
- statement.execute()后,就可以通过statement.getResultSet()来获取结果集,
2.mybatis的如何批量更新或者插入
3.mybatis的缓存
- 一级缓存
- SqlSession级别(默认开启)是一个hashmap本地缓存
- 二级缓存
4.mybatis中#{}和${}的区别
5. jdbc过程
- 加载数据库驱动
- 获取数据库的连接对象
- 获取语句对象
- preStatement ?占位符
- Statement # 拼接字符串
- 处理结果集
- 关闭资源
第四章 springboot
1. springboot的理解,它有哪些特性(优点)
springboot用来快速开发spring应用的一个脚手架,主要就是简化新spring应用的初始搭建以及开发过程
- 内部提供了很多的启动器,对主流框架无配置集成,开箱即用。
- 简化了开发,采用javaconfig的方式可以使用零xml的方式进行开发
- 内置了web服务器,直接运行jar就可以web应用。
2. springboot与spring的关系和区别
springboot是spring生态的产品。
- 他是快速开发spring应用的一个脚手架
- 约定大于配置
springFramework是一个容器框架
2. springboot的核心注解
- springbootapplication
- springbootConfiguration
- enableAutoConfiguration
- conditionalOnbean
- conditionalOnClass
3. springboot的自动配置原理
- 通过springbootConfiguration引入了enableAutoConfiguration(负责启动自动装配的功能)
- enableAutoConfiguration引入了import
- spring容器启动的时候:加载ioc容器就会解析import注解
- import导入了一个deferredimportSelector(延迟导入注册器),它会使springboot的自动配置类的顺序排列在最后
- 然后读取所有的/meata-inf/spring.fatories文件
- 过滤出所有的AutoConfiguration类型的类
- 最后通过condition排除无效的自动配置类
4. 为什么springboot的jar可以直接运行
- springboot提供了一个插件spring-boot-maven-plugin用于程序打包
- springboot应用打包之后,生成一个fat jar(jar中包含jar),包含了应用里来的jar包和spring boot loader相关的类
- java -jar 的时候 会去jar包找manifest文件,在哪里找到真正的启动类
- fat jar的启动main函数是jarLauncher,它负责创建并加载lib下的所有jar,并开启一个新县城启动应用的main函数
5. 为什么springboot的启动原理
当运行run方法的时候
- 初始化 springApplication从spring factories读取初始化器
- 运行run方法
- 读取环境变量 配置信息
- 创建springApplication上下文
- 初始化上下文:读取启动类
- 调用spring的refresh 加载ioc容器
- 加载所有的自动配置类
- 创建(内置)的servlet容器
- 在这个过程中springboot会调用很多的监听器对外进行扩展
6. springboot内置tomcat的启动原理
- 当依赖spring-boot-start-web,会在springboot添加一个servelt工厂,加载自动配置类(启动的应用服务器)
- 该自动配置类,通过conditionalOnClass判断使用哪一个web容器(默认tomcat
- 在内嵌的tomcat类中配置了一个web容器工厂
- 它会在springboot启动的时候 加载ioc容器,创建内嵌的tomcat时启动
7. springboot自定义一个stater
最主要的就是在自己定义的stater文件中添加 MEATA-INF/spring.factories文件
需要维护在enableAutoConfiguration
8. springboot读取配置文件的原理是什么
是通过事件通知的方式读取的,有一个监听器有一个配置文件的监听器(configFile)
9. springboot默认日志实现框架是什么?
logback