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

SSM框架

作者头像
京剧猫
发布2023-03-04 11:14:37
8000
发布2023-03-04 11:14:37
举报
文章被收录于专栏:Pixel FandomPixel Fandom

1. 什么是Spring?

Spring是针对企业级应用而开发的开源型框架。其核心主要包括IOC(控制反转)DI(依赖注入)以及AOP(面向切面编程)

  • IOC(控制反转) 以往我们创建对象的方式都是通过new或者getInstance方法来直接或间接创造,而在Spring中,其可以通过工厂模式为我们创建所需要的对象,我们只需要直接调用就可以了
  • DI(依赖注入) 当Spring为我们创造好bean对象后,会通过javabean中的set方法带参数的构造方法为创造的对象自动设置所需要的值
  • AOP(面向切面编程) 指的是将对象的某些类型的方面横向抽取成一个切面,对这个切面进行一些注入权限控制、事物管理等公共操作的过程

2. SpringBean的生命周期

bean.png
bean.png

3. IOC中Bean的注入方式

  1. 构造器依赖注入:通过容器触发一个类的构造器实现,类中每一个参数都代表一个对其他类的依赖
  2. setter方法注入:容器通过调用无参构造器或无参static工厂方法实例化bean后,调用bean的的set方法注入
  3. 基于注解注入

4. Bean的配置方式

  1. 通过xml文件进行配置:将bean的相应信息配置在xml文件中,spring会自动读取该配置文件并实例化与设置bean的属性
  2. 通过注解进行配置:spring可以扫描带有特定注解的类来管理并创建bean
    • @Component:当不缺定该类是哪一层的bean时,可以使用该注解
    • @Controller:用于注册控制层的bean
    • @Service:用于注册服务层的bean
    • @Repository:用于注册dao层的bean
  3. 通过java config进行配置:可以通过在类上添加@Configuation注解声明该类为配置类,随后在类中方法上添加@Bean注解表明该类会生成并返回一个Bean对象

5. SpringBean的自动装配方式

自动装配提供种中不同的模式供Spring容器自动装备Bean之间的依赖注入:

  1. no:不自动装配,手工设置bean
  2. byName:通过匹配bean的名字实现自动装配
  3. byType:通过匹配bean的类型实现自动装配
  4. constructor:与byType类似,只不过匹配的是构造器的参数类型
  5. autodetect:如果有默认构造方法,则通过constructor方式装配,否则通过byType方式注入

6. AOP的基本概念

  1. 切面:指的是事物之间的相似部分
  2. 连接点:指的是程序运行到的某一步
  3. 通知:指的是切面对于连接点所对应的行为
  4. 切入点:与连接点相对
  5. 目标对象:被一个或多个切面所通知的对象
  6. AOP代理:分为jdk动态代理cglib代理

7. AOP的实现原理

  1. 当目标对象是一个接口时,AOP采用的jdk动态代理的方式,其通过该接口的实现类进行动态代理
  2. 当目标对象是一个类时,AOP采用的是cglib代理的方式,其通过该类的一个集成子类进行动态代理

8. SpringBean的作用域

  1. singleton:唯一,Spring中的贝尔安默认都是单例的
  2. prototype:每次请求都会生成一个bean对象
  3. request:每次http请求都会生成一个bean,该bean只在当前request内有效
  4. session:每次http请求都会生成一个bean,该bean只在当前session作用域内有效
  5. global-session:在全局session内有效

9. Spring框架中的单例Bean的线程安全问题

不是,主要体现在多线程操作同一对象时,对这个对象的非静态变量的写操作。但是同样有两种解决方案:

  1. 尽量避免可变的成员变量
  2. 在类中定义一个ThreadLocal对象,将可变成员变量保存在ThreadLocal中 2.1 ThreadLocal线程变量指的是在ThreadLocal中的变量是属于当前线程的,该变量对于其他线程隔离。同时ThreadLocal会为每一个线程都创建一个该变量的副本,线程所操作的都是自己的副本变量 2.2 ThreadLocal与synchronized的区别:
    • synchronized用于线程间的数据共享,ThreadLocal用于数据的隔离
    • synchronized利用锁机制使得变量/代码块在同一时刻只可以被一个线程访问,ThreadLocal则是为每个线程都提供了变量的副本,每个线程访问的都是不同的对象,故是相互隔离的

10. Spring的事务管理

  1. 编程式事务:通过Transaction Template等管理事务并执行相应的操作,属于硬编码
  2. 声明式事务:在配置文件中声明,基于AOP在目标方法前后拦截并在目标方法开始前加入事务,在目标方法结束后提交或回滚事务,分为: 2.1 基于xml的声明式事务 2.2 基于注解@Transaction的声明式事务

11. Spring的事务传播行为

事务的传播是为了解决业务层方法之间的相互调用的事务问题,分为三个大类:

  1. 支持当前事务
    • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务便加入事务,否则新建一个事务
    • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务则加入事务,否则以非事务的方式运行
    • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务则加入事务,否则抛出异常
  2. 不支持当前事务
    • TransactionDefinition.PROPAGATION_REQUIRES_NEW:新建一个事务运行,否则将当前事务挂起
    • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,否则将该事务挂起
    • TransactionDefinition.PROPAGATION_NEVER:以非事务的方式运行,否则抛出异常
  3. 其他
    • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则新建一个事务作为该事务的嵌套事务运行,否则新建一个事务运行

12. Spring中的事务隔离级别

  1. TransactionDefinition.ISOLATION_DEFAULT:默认隔离级别,mysql采用TransactionDefinition.ISOLATION_REPEATABLE_READ,Oracle采用TransactionDefinition.ISOLATION_READ_COMMITTED
  2. TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最不安全的隔离级别,允许事务读取尚未提交的数据,有脏读、幻读、不可重复读的问题
  3. TransactionDefinition.ISOLATION_READ_COMMITTED:允许事务读取已提交的数据,可以避免脏读
  4. TransactionDefinition.ISOLATION_REPEATABLE_READ:事务对同一字段数据的多次读取结果都是一致的,避免了脏读与不可重复读
  5. TransactionDefinition.ISOLATION_SERIALIZATION:最高的事务隔离级别,完全符合事务的ACID要求,完全避免了脏读、幻读与不可重复读

13. Spring的通知及其类型

Spring的通知指的是方法执行前后要做的动作,有5种类型:

  1. 前置通知:在连接点之前执行的通知,其不会阻止连接点前的执行
  2. 后置通知:在连接点退出后执行的通知(不论是正常退出还是异常退出)
  3. 返回后通知:当连接点正常完成执行后执行的通知
  4. 环绕通知:在连接点前后执行的通知
  5. 抛出异常后通知:当方法抛出异常退出时执行的通知

14. Spring中的设计模式

  1. 工厂模式:Spring使用工厂模式通过BeanFactory与ApplicationContext创建Bean对象
  2. 单例模式:Spring所创建的Bean默认都是单例的
  3. 代理模式:Spring AOP运用到了jdk动态代理以及cglib代理
  4. 模板方法:用于解决代码的重复问题
  5. 观察者模式:定义对象的一种一对多的关系,当被观测的对象发生变化时,所有观测对象都会收到通知并更新
  6. 包装器设计模式:当项目连接多个数据库,且不同客户每次访问根据需要,访问的数据库也不同时,这种模式可以根据客户需要动态切换不同的数据库
  7. 适配器模式:Spring AOP的增强或通知运用到了这种模式
  8. 建造者模式:lombok有一个@Builder注解,可以实现建造者模式,核心包括链式编程静态内部类的使用以及build()方法创建外部对象

15. BeanFactory与ApplicationContext的区别

  • BeanFactory是基础的IOC容器,提供完全的IOC服务支持,默认采用延迟初始化策略,容器启动初期速度快,占用资源低
  • ApplicationContext是比较高级的IOC容器实现,是基于BeanFactory的基础实现的,除其所有支持外,还提供了事件发布、国际化支持等功能。ApplicationContext所管理的对象在容器启动后默认全部初始化并并绑定完成

16. Spring常用注解

  1. @Autowired:用于有值设值方法、非设值方法、构造方法与变量
  2. @Component:用于任一层的bean
  3. @Repository:用于dao层的bean
  4. @Controller:用于控制层的bean
  5. @Service:用于服务层的bean
  6. @Value:为bean进行简单的属性注入
  7. @ComponentScan:扫描包下的组件
  8. @Configuration:声明类为配置类,与@Bean搭配使用
  9. @Transaction:开启事务管理功能

17. @Resources与@Autowired的区别

  1. 都用于自动装配,都可以放于字段
  2. @Autowired通过byType方式实现自动装配,要求对象必须存在,@Resources先通过byNme方式实现,如果没有会采用byType方式,否则报错

18. @Component与@Bean的区别

  1. 作用对象不同 @Component注解作用于类,@Bean作用于方法
  2. @Component通常与@ComponentScan搭配使用,通过类路径扫描来自动侦测与自动装配,@Bean与@Configuration搭配使用,表明配置类中的方法会生成并返回一个bean
  3. @Bean的自定义性要更强。当引入第三方库时只能使用@Bean注解

19. 将一个类声明为Spring Bean的注解

  1. @Component
  2. @Controller
  3. @Service
  4. @Repository

20. Spring如何解决循环依赖

首先需要明确几个重要概念:

  • singletonObjects(一级缓存):存放可以直接运行的Bean
  • earlySingletonObjects(二级缓存):存放已创建但尚未赋值的Bean
  • singletonsCurrentlyCreation(三级缓存):存放正在被创建的Bean

解决循环依赖的流程:

  1. 初始化Bean之前,Bean会被放入三级缓存中
  2. createNewInstance方法执行完毕后执行addSingletonFactory,将已实例化但未赋值的Bean放入二级缓存,并从三级缓存中移除
  3. 进行属性的赋值与自动注入,引发关联创建
  4. 关联创建时,检查”正在创建的Bean“中是否有即将注入的Bean,如果有会检查二级缓存中是否存在,如果不存在一般会在三级缓存中找到,随后将这个Bean放入二级缓存并从三级缓存中移除
  5. Bean被成功注入后,执行addSingleton将创建好的Bean放入一级缓存并从二级缓存与三级缓存中移除

21. Spring MVC三层架构与三层体系的关系

Fig 1
Fig 1

22. Spring MVC 常用注解

  1. @RequestMapping:用于处理请求url映射,可用于类或方法
  2. @RequestBody:用于实现接收HTTP请求的json数据,并将其转化为java对象
  3. @ReponseBody:用于将Controller方法返回的对象转化为json对象相应给前端

23. SpringMVC设置重定向与转发

  • 重定向:返回值前添加redirect::
  • 转发:返回值前添加forward:

24. SpringMVC处理异常的方法

  1. 自定义一个异常处理器(实现HandlerExceptionResolver接口),并实现其中的异常处理方法,将该类交给Spring容器管理
  2. 在类上添加注解(@ControllerAdvice)表明该类是一个全局异常处理类,在方法上添加注解(@ExceptionHandler),在ExceptionHandler中有一个value属性,用于指定可以处理的异常类型

25. MyBatis中#{}与${}的区别

  • #{}是预编译处理,MyBatis在处理时会在sql中将#{}替换为?,调用PreparedStatement的set方法进行赋值
  • ${}是字符串替换,MyBatis在处理时会直接替换变量的值

26. MyBatis中实体类属性名与表中字段名不一致的处理方法

  1. 在Mapper映射文件中使用resultMap进行手动映射
  2. 在定义sql语句时通过as起别名

注:对于MyBatis Plus可以直接在实体类上添加@TableField注解进行映射或者使用resultType


27. MyBatis的分页方法以及分页插件的原理

  1. 物理分页:MyBatis使用RowBounds对象进行分页,是针对ResultSet结果集执行的内存分页。可以在sql内直接书写带有物理分页的参数来完成物理分页
  2. 分页插件:将所有内容查询出来然后在物理内存中截取,原理是通过sql语句进行拦截并在其后添加limit达到分页的目的

28. MyBatis中的动态SQL

  1. 动态SQL可以让我们在xml映射文件内以标签的形式编写动态SQL语句,完成逻辑判断与动态拼接等功能
  2. 共有9种动态SQL标签:trimwheresetforeachifchoosewhenotherwisebind
  3. 执行原理:使用OGNL从SQL参数对象中计算表达式的值,根据值进行动态拼接SQL语句

29. ResultType与ResultMap的区别

  • 如果数据库结果集中的列名与封装实体类的属性名完全一致采用resultType
  • 如果二者不一致则需要采用resultMap进行手动建立映射关系

30. MyBatis中的设计模式

  1. Builder模式:如sqlSessionFactoryBuilderXMLConfigBuilder
  2. 工厂模式:如sqlSessionFactoryObjectFactory
  3. 单例模式:如ErrorContextLogFactory
  4. 代理模式:MyBatis实现的核心采用了jdk动态代理,部分包还是使用了cglib或javassist达到延迟加载的效果
  5. 组合模式:如SqlNode及其子类ChooseSqlNode
  6. 模板方法模式:如BaseExecutorSimpleExecutor
  7. 适配器模式:如Log的MyBatis接口
  8. 装饰器模式:如Cache包中的cache.decorators子包
  9. 迭代器模式:如PropertyTokenizer
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是Spring?
  • 2. SpringBean的生命周期
  • 3. IOC中Bean的注入方式
  • 4. Bean的配置方式
  • 5. SpringBean的自动装配方式
  • 6. AOP的基本概念
  • 7. AOP的实现原理
  • 8. SpringBean的作用域
  • 9. Spring框架中的单例Bean的线程安全问题
  • 10. Spring的事务管理
  • 11. Spring的事务传播行为
  • 12. Spring中的事务隔离级别
  • 13. Spring的通知及其类型
  • 14. Spring中的设计模式
  • 15. BeanFactory与ApplicationContext的区别
  • 16. Spring常用注解
  • 17. @Resources与@Autowired的区别
  • 18. @Component与@Bean的区别
  • 19. 将一个类声明为Spring Bean的注解
  • 20. Spring如何解决循环依赖
  • 21. Spring MVC三层架构与三层体系的关系
  • 22. Spring MVC 常用注解
  • 23. SpringMVC设置重定向与转发
  • 24. SpringMVC处理异常的方法
  • 25. MyBatis中#{}与${}的区别
  • 26. MyBatis中实体类属性名与表中字段名不一致的处理方法
  • 27. MyBatis的分页方法以及分页插件的原理
  • 28. MyBatis中的动态SQL
  • 29. ResultType与ResultMap的区别
  • 30. MyBatis中的设计模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档