ssm总结
第一章 spring
1.什么是spring/发展历程
- 2004推出spring1.0(注解驱动的启蒙时代)
- 2006年推出spring2.0(注解驱动过度的时期)
- 一些注解现在都还在用比如
- controller
- component
- service
- requestmapping
- 2009推出spring3.0(注解驱动的黄金时代)
- configuration
- importResource
- componentscan
- 2013推出spring4.0(注解驱动完善时代)-springboot1.0
- crossorign
- 2017推出spring5.0(注解驱动的成熟时代)-springboot2.0
- indexed 提升componentscan效率
- 2022年推出spring6.0
2.spring的组成
主要部分
- core
- 核心类库,提供ioc服务
- context
- 提供框架式的bean访问方式(定时任务)
- aop
- aop服务
- dao
- 对jdbc的抽象,简化了数据访问异常的处理
- orm
- 对orm框架的支持
- web
- 提供了基本的面相web的综合特征,比如文件上传
- mvc
- 提供面向web应用的 model-view-controller实现
3.spring框架中哪些设计模式
- 单例模式
- spring中最明显的单例应用场景就是在配置文件中配置注册bean对象的时候设置scope的值为singleton
- 模版方法
- spring中的refresh方法,把创建容器初始化的过程都约定好了
- jdbc的模版工具
- 观察者模式
- 监听器,生命周期
- 工厂模式
- getbean获取对象
- 适配器
- 在aop的实现,mybaties有个日志模块,对于适配器很方便。
- 代理模式
- aop通过cjlib或者jdk动态代理。
- 策略模式
- 实例话对象的时候
- 责任链模式
- aop中的拦截器
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预处理后,进行设置参数
- TypeHandler参数绑定
- 通过Executor来执行sql
- 在MyBatis,也是调用Statement.executeXxx()来执行sql
-
- 对sql进行预处理;
-
- 调用statement.executeXxx()执行sql;
-
- 将数据库返回的结果集进行对象转换(ORM);
-
- 在MyBatis,也是调用Statement.executeXxx()来执行sql
- statement.execute()后,就可以通过statement.getResultSet()来获取结果集,
2.mybatis的如何批量更新或者插入
- ON DUPLICATE KEY UPDATE
3.mybatis的缓存
- 一级缓存
- SqlSession级别(默认开启)是一个hashmap本地缓存
- 二级缓存
- 需要手动开启,mapper级别
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
- springboot应用
- springbootConfiguration
- 配置类
- enableAutoConfiguration
- 启动自动配置类
- conditionalOnbean
- 包含哪些bean
- conditionalOnClass
- 包含哪些class
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
- 如果想切换
- 需要排除依赖,添加需要使用的启动器
相关文章
- layui弹出层使用方法总结
- 软件项目管理知识点总结
- SSM项目总结
- 计算机端口详解(总结)「建议收藏」
- 金九银十前端面试题总结(附答案)
- JS面试、技巧总结点一-变量提升/函数提升
- Linux 内核编程总结[通俗易懂]
- 驱动GPIO操作总结
- SQLServer常见数学函数梳理总结
- 结合SSM框架和Redis实现更加便捷的开发(整合redis到ssm)
- 基于SSM框架与Redis结合存储数据(ssm框架redis转存)
- SSM框架如何配置Redis缓存(ssm怎么配置redis)
- 使用SSM框架实现Redis缓存功能(ssm使用redis缓存)
- SSM框架结合Redis实现快速教学部署(ssm使用redis教程)
- SSM框架中使用Redis轻松实现高效数据存储(ssm中redis搭建)
- 使用SSM框架实现Redis加速缓存系统(ssm中redis原理)
- 控制基于SSM Redis实现高效权限控制(ssm redis权限)
- 尝试Redis结合SSM框架开启新模式(redis集成ssm)
- SSM框架利用Redis作缓存优化(ssm继承redis)
- 的应用SSM框架下Redis的有效利用(ssm框架下redis)
- Oracle数据库上月最后一天总结(oracle上月最后一天)