SSM框架+SpringBoot

SSM框架

对Spring的认识

spring是一个轻量级的开源框架,是用来简化java开发。其中最核心的就是ioc和aop

IOC容器技术(控制反转),帮助我们自动管理依赖的对象,不需要我们自己创建和管理依赖对象,从而实现了层与层之间的解耦。所以ioc最重要的就是解耦。

AOP技术(面向切面编程),方便我们将一些非核心业务逻辑抽离,从而实现核心业务和非核心业务的解耦。比如添加一个商品信息,其中核心业务逻辑就是添加商品信息,非核心业务就是 事务管理,读写分离,日志,性能检测。

spring还方便我们集成一些优秀的框架,比如说mvc框架,springmvc,struts2(思抓思)等 比如说orm框架 mybatis hibernate(嗨播嫩特)

Spring 的bean作用域有哪些

  1. 默认是singleton 单例模式(sing狗疼)
  2. prototype(婆特太破), 每次从容器中调用bean都会创建一个新的对象,比如说整合struts2框架的时候,spring管理action对象就是需要这么设置的
  3. request,每次http请求都会创建一个对象
  4. session 同一个session共享一个session对象
  5. global-session

Spring的bean是线程安全的吗?

原型Bean

对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

单例Bean

对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。
注: Spring容器本身并没有提供线程安全的策略,因此是否线程安全完全取决于Bean本身的特性。

说一下 MyBatis 的一级缓存和二级缓存?

一级缓存:它指的是Mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域的结构是一个Map,当我们再次查询同样的数据,mybatis会
先去sqlsession中查询是否有,的话直接拿出来用,当SqlSession对象消失时,mybatis的一级缓存也就消失了,同时一级缓存是SqlSession范围的缓存,当调用SqlSession的修改、添加、删除、commit(),close等
方法时,就会清空一级缓存。
  二级缓存:他值得是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存,但是其中缓存的是数据而不是对象,所以从二级缓存再次查询出得结果的对象与第一次存入的对象是不一样的。

补充:mybatis缓存是针对sql语句查询效率的优化,而不是作为缓存来使用的。

spring mvc 有哪些组件?

Spring MVC的核心组件:

  1. DispatcherServlet:中央控制器,把请求给转发到具体的控制类
  2. Controller:具体处理请求的控制器
  3. HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
  4. ModelAndView:服务层返回的数据和视图层的封装类
  5. ViewResolver:视图解析器,解析具体的视图
  6. Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

Spring MVC 运行流程

  1. 客户发送请求到前端控制器(dispatcherservlet)
  2. 前端控制器请求处理器映射器(HandlerMapping)
  3. 处理器映射器根据url查找相应的处理器(Handler),返回处理器执行链(HandlerExecutiomChain)给前端控制器(DispatcherServlet)
  4. 前端控制器(DispatcherServlet)请求处理器适配器(jandlerAdapter)
  5. 处理器适配器(HandlerAdapter)执行处理器(Handler),生成视图(ModelAndView),返回视图(ModelAndView)给前端控制器(DispatcherServlet)
  6. 前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)
  7. 视图解析器(ViewResolver)返回视图对象给前端控制器(DispatcherServlet)
  8. 最后渲染视图

SSM框架+SpringBoot

spring mvc的自定义拦截器的实现?

SpringMVC 中的Interceptor 拦截器,它的主要作用是拦截用户的请求并进行相应的处理。用户可以自定义拦截器来实现特定的功能,比如通过它来进行权限验证,或者是来判断用户是否登陆等。

SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。所以要想实现自己的拦截管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。

spring mvc的上传图片是怎么实现的?

首先在spring mvc的配置文件中,配置上传文件的组件配置然后前端上传图片的时候 需要添加标签

Spring事务的传播行为类型?

场景:同一个事务内(同一个服务内)

名称 数据的状态 实际行为 产生原因
脏读 未提交 打算提交但是数据回滚了,读取了提交的数据 数据的读取
不可重复读 已提交 读取了修改前的数据 数据的修改
幻读 已提交 读取了插入前的数据 数据的插入

事务的隔离级别:

名称 结果 脏读 不可重复读 幻读
Read UnCommitted(读未提交) 什么都不解决
Read Committed(读提交) 解决了脏读的问题
Repeatable Read(重复读) (mysql的默认级别)解决了不可重复读
Serializable(序列化) 解决所有问题
  • READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
  • READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
  • REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能非常低。

事务的传播行为

事务的传播行为 说明
PROPAGATION_REQUIRED 如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
PROPAGATION_MANDATORY 如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
PROPAGATION_REQUIRES_NEW 重新创建一个新的事务,如果当前存在事务,延缓当前的事务。
PROPAGATION_NOT_SUPPORTED 以非事务的方式运行,如果当前存在事务,暂停当前的事务。
PROPAGATION_NEVER 以非事务的方式运行,如果当前存在事务,则抛出异常。
ROPAGATION_NESTED 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

SpringBoot

SpringBoot常用注解

  1. 启动类

    @SpringBootApplication:包含@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

    @SpringBootConfiguration:表示Application作为配置文件存在
    @EnableAutoConfiguration:表示启用SpringBoot内置的自动配置功能
    @ComponentScan : 扫描bean,路径为Application类所在package以及package下的子路径,在spring boot中bean都放置在该路径以及子路径下。

  2. 表现层

    @Controller

    • @RestController:用于处理HTTP请求,@RestController= @Controller [email protected]
    • @ResponseBody:将java对象转为json格式的数据。
    • @RequestMapping:用于配置url映射
      @GetMapping组合注解相当于 @RequestMapping(method = RequestMethod.GET)
      @PostMapping组合注解相当于 @RequestMapping(method = RequestMethod.POST)
    • @RequestParam
      将请求参数绑定到你控制器的方法参数上,是springmvc中接收普通参数的注解。请求中的参数名和处理器中的形参名不一致时用 @RequestParam。
      语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
      value:参数名
      required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
      defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。
  3. 业务层

    @Service等。

  4. 持久层

    @Repository等。

  5. 任意层

    • @Component
      @Component, @Service, @Controller, @Repository是Spring注解,注解后可以被Spring框架所扫描并注入到Spring容器来进行管理。
      @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能。
    • 读取配置文件
      @Value:注入Spring boot application.properties配置的属性的值。
    • 生成Bean
      @Autowired:自动导入依赖的bean。
      @Resource:@Autowired与@Resource都可以用来装配bean,都可以写在字段上或写在setter方法上。

谈谈你对SpringBoot的理解

Spring Boot开发始于 2013 年,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
spring boot 是微服务框架的起点,他简化了开发过程,配置过程、部署过程、监控过程。
它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了很多的框架,同时将其他技术同spring结合起来。通过SpringBoot我们可以很快的搭建一套web项目。
不足:
SpringBoot还需要与外围的框架进行集成1)认证鉴定方面2)监控方面等

讲一下SpringBoot的四大核心功能

起步依赖机制:通过起步依赖机制(Starter),简化jar包的引用,解决jar版本冲突问题。
自动配置:可以实现简单配置,甚至是零配置,就能搭建整套框架。
StringBoot CLI(命令行界面):一种命令工具。
Actuator:是SpringBoot的程序监控器,可监控Spring应用程序上下文中的Bean、查看自动配置决策、Controller映射、线程活动、应用程序健康状况等。

SpringBoot的自动配置

springboot的自动配置,指的是springboot,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。 “自动”的表现形式就是我们只需要引我们想用功能的包,相关的配置我们完全不用管,springboot会自动注入这些配置bean,我们直接使用这些bean即可。