前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ssm总结

ssm总结

作者头像
高大北
发布2023-01-01 09:50:05
3450
发布2023-01-01 09:50:05
举报

第一章 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的生命周期

代码语言:javascript
复制
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
    1. 首先进入refresh();
    1. beanfactoryInitialization初始化所有单例对象
    1. preInstantiateSingletons处理所有的单例对象
    1. 调用getbean,dogetbean先查询该对象有被初始化过
    1. 通过createBean,doCreateBean,createBeanInstance,以反射的方式创建对象,一般使用的无参构造方法(newInstance)
    1. popualteBean给对象set方法负值
    1. InitializeBean对bean进行初始化
    1. 调用beanPostProcessor前置方法(前置创建代理类)
    1. 调用initmethod方法
    1. 调用beanPostProcessor中的后置方法:【没有做任何事情】(spring 的aop就是在此处实现的)
    1. 销毁流程
    • 判断是否实现了dispoablebean接口,调用destoryMethod方法

9.谈谈spring aop的理解,原理以及实现

aop是ioc的扩展功能,先有的ioc,再有的aop,aop只是ioc的流程中的一个扩展点。beanPostProcessor, aop概念,应用场景,动态代理,

  1. 首先启动SpringAop时,会使用该@EnableAspectJAutoProxy注解
  2. 将@Import(AspectJAutoProxyRegistrar.class)注入SpringIOC容器中
  3. AspectJAutoProxyRegistrar中会注册对象 BeanId:org.springframework.aop.config.internalAutoProxyCreator BeanClass :AnnotationAwareAspectJAutoProxyCreator
  4. AnnotationAwareAspectJAutoProxyCreator最为核心:使用后置通知在bean的对象初始化的时候,实现对代理对象的增强。 AnnotationAwareAspectJAutoProxyCreator祖宗: AbstractAutoProxyCreator 祖宗有是BeanPostProcessor
  5. 被代理对象在初始化的时候,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
        1. 对sql进行预处理;
        1. 调用statement.executeXxx()执行sql;
        1. 将数据库返回的结果集进行对象转换(ORM);
  • statement.execute()后,就可以通过statement.getResultSet()来获取结果集,

2.mybatis的如何批量更新或者插入

  • ON DUPLICATE KEY UPDATE

3.mybatis的缓存

  • 一级缓存
    • SqlSession级别(默认开启)是一个hashmap本地缓存
  • 二级缓存
    • 需要手动开启,mapper级别

4.mybatis中#{}和${}的区别

  • #{}
    • 占位符
  • ${}
    • 拼接符

5. jdbc过程

  1. 加载数据库驱动
  2. 获取数据库的连接对象
  3. 获取语句对象
    • preStatement ?占位符
    • Statement # 拼接字符串
  4. 处理结果集
  5. 关闭资源

第四章 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的自动配置原理

  1. 通过springbootConfiguration引入了enableAutoConfiguration(负责启动自动装配的功能)
  2. enableAutoConfiguration引入了import
  3. spring容器启动的时候:加载ioc容器就会解析import注解
  4. import导入了一个deferredimportSelector(延迟导入注册器),它会使springboot的自动配置类的顺序排列在最后
  5. 然后读取所有的/meata-inf/spring.fatories文件
  6. 过滤出所有的AutoConfiguration类型的类
  7. 最后通过condition排除无效的自动配置类

4. 为什么springboot的jar可以直接运行

  1. springboot提供了一个插件spring-boot-maven-plugin用于程序打包
  2. springboot应用打包之后,生成一个fat jar(jar中包含jar),包含了应用里来的jar包和spring boot loader相关的类
  3. java -jar 的时候 会去jar包找manifest文件,在哪里找到真正的启动类
  4. 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

  • 如果想切换
    • 需要排除依赖,添加需要使用的启动器
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一章 spring
    • 1.什么是spring/发展历程
      • 2.spring的组成
        • 3.spring框架中哪些设计模式
          • 4.autowired和resource关键字的区别
            • 5.spring中常用的注解有哪些?[需要加源码解析]
              • 6.spring循环依赖/如何解决循环依赖问题
                • 7.谈谈spring ioc的理解,原理以及实现
                  • 8.bean的生命周期
                    • 9.谈谈spring aop的理解,原理以及实现
                      • 10.谈谈spring的事物如何回滚的
                        • 11.谈谈spring的事物传播/传播特性有几种?
                          • 12.bean factory 与 factorybean
                            • 13.bean factory 与 applicationContext之别是什么?
                            • 补充
                              • 1.jdk/cjlib区别
                              • 第二章 springmvc
                                • 1.springmvc的执行流程
                                • 第三章 mybatis
                                  • 1.mybatis的执行sql的过程
                                    • 2.mybatis的如何批量更新或者插入
                                      • 3.mybatis的缓存
                                        • 4.mybatis中#{}和${}的区别
                                          • 5. jdbc过程
                                          • 第四章 springboot
                                            • 1. springboot的理解,它有哪些特性(优点)
                                              • 2. springboot与spring的关系和区别
                                                • 2. springboot的核心注解
                                                  • 3. springboot的自动配置原理
                                                    • 4. 为什么springboot的jar可以直接运行
                                                      • 5. 为什么springboot的启动原理
                                                        • 6. springboot内置tomcat的启动原理
                                                          • 7. springboot自定义一个stater
                                                            • 8. springboot读取配置文件的原理是什么
                                                              • 9. springboot默认日志实现框架是什么?
                                                              相关产品与服务
                                                              容器服务
                                                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                                              领券
                                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档