SSM框架知识总结

SSM框架知识总结


文章目录


一、详细描述什么是Spring?

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。可以降低组件之间的耦合度,便于系统组件的维护,扩展和替换。提供对持久层、事务的支持;此外,对现存的各种框架,Spring也提供了相应的整合方案。

二、什么是Spring IOC?

IOC(Inverse of Controller):控制反转

  • 控制:对象的创建、初始化、销毁和对象之间关系的指定
  • 反转:将控制的逻辑交给第三方框架或者容器负责,当两个组件之间的关系发生改变时,只需要修改框架或者容器的配置

三、什么是Spring AOP?描述其应用场景(最少3个)

AOP,即面向切面编程,简单说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于后期的操作和维护。
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )

四、 AOP的通知有几个,分别是什么

  1. 前置通知(Before):方面组件在目标组件之前执行
  2. 后置通知(After):方面组件在目标组件之后执行,目标组件方法没有抛出异常才会执行方面组件
  3. 最终通知(After-returning ):方面组件在目标组件之后执行,目标组件不管是否发生异常都会执行
    方面组件
  4. 异常通知(After-throwing):方面组件在目标组件抛出异常之后执行
  5. 环绕通知(Around):方面组件在目标组件之前和之后执行

五、 描述Spring Bean的作用域?

Spring框架支持以下五种bean的作用域:

  • singleton : 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认
    值。
  • prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行
    newXxxBean()。
    以下作用域仅在基于web的Spring ApplicationContext情形下有效:
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring
    WebApplicationContext环境。
  • session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web
    的Spring WebApplicationContext环境。
  • application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的
    Spring WebApplicationContext环境。

六、 Spring Bean 注入有几种方式?

  1、 set方法注入
  2、构造器注入
  3、工厂方法注入

七、SpringBean 生命周期?

1通过构造器或工厂方法创建 Bean 实例
2为 Bean 的属性设置值和对其他 Bean 的引用
3调用 Bean 的初始化方法
4使用Bean
5当容器关闭时 close(), 调用 Bean 的销毁方法

八、 Spring框架中 用到了哪些设计模式?(不低于3个)

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

九、 描述Spring事务传播行为?

  • REQUIRED(常用):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:强制的 使用当前的事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:需要JTA事务管理器的支持,新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

十、 描述Spring事务的隔离级别?

1.数据库默认的隔离级别
2.读未提交
3.读已提交
4.可重复读
5.串行化

十一、Spring事务传播行为 REQUIRED和REQUIRES_NEW区别

在同一个方法中,因为大多数情况是一系列业务要保证要么都成功要么都失败的,所以各个业务方法使用默认的REQUIRED方式。
如果一个特殊的业务方法,和其他业务不关联,给它的方法设置REQUIRES_NEW,这样就能保证其他业务有异常时也不会被回滚。

十二、 什么是MyBatis?

MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。

十三、 #{}和${}的区别是什么? 应用场景

#{}是预编译处理,${}是字符串替换/拼接。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值。
使用#可以有效的防止SQL注入,提高系统安全性。
场景:
#{ }:#代表占位符,用来传递参数; 传参在进行SQL预编译时,防止 SQL注入。
$ { }:$常用来拼接sql。例如:表名、列名、排序等;

十四、在mapper中如何传递多个参数,都有哪几种

1.将多个参数封装到map中
2.将多个参数封装到javaBean中
3.接口方法形参有多个,在xml文件中,通过param1,param2或者arg0,agr1传递参数值
4.在接口方法形参前使用@Param(“参数名”)注解标记,注解标记中的参数名与xml表达式(#{})的名字必须一致

十五、 说出MyBatis动态标签(至少5个)

- if
- choose
- where
- forEach
- trim

十六、 parameterType和resultType的区别

-resultType:主要针对于从数据库中提取相应的数据出来所对应的类型。类的名字和数据库相同时,可以直接设置 resultType 参数为 Pojo 类。若不同,需要设置 resultMap 将结果名字和 Pojo 名字进行转换
-parameterType:主要针对于将方法入参类型描述。如:insert 增加数据到数据库,update更新数据等。

十七、 在用MyBatis插入时,如何得到数据库自增的主键值?

1. useGeneratedKeys:使用主键回填,默认false
2. last_insert_id:最后一条记录的id值

十八、 MyBatis批量删除/添加时,代码实现

通过使用foreach标签
 <!-- 批量添加
   insert into user(name,email...) values (, , , , , )
  -->

  <insert id="insertBatch">
       insert into user (name, email,
      telphone, zone, province,
      city, rid, status,
      create_date)
    values
    <foreach collection="list" item="u" separator=",">
    ( #{u.name}, #{u.email,jdbcType=VARCHAR},
      #{u.telphone,jdbcType=VARCHAR}, #{u.zone,jdbcType=VARCHAR}, #{u.province,jdbcType=VARCHAR},
      #{u.city,jdbcType=VARCHAR}, #{u.rid,jdbcType=INTEGER}, #{u.status,jdbcType=SMALLINT},
      #{u.createDate,jdbcType=TIMESTAMP})
    </foreach>
  <!--  批量删除
     delete from 表名 where id in (1,2,3,4,5);
   -->
  <delete id="deleteBatch">
        delete from user where id in
        <foreach collection="array" open="("  item="id" separator=","  close=")">
            #{id}
        </foreach>
  </delete>

十九、 MyBatis动态SQL执行流程和原理

1.加载配置文件
mybatis由SqlSessionFactoryBuilder解析mybatis配置文件,将sql的配置信息加载成为一个个的MappedStatement对象(包含执行的sql语句,传入参数映射配置,结果映射配置),并将其储存在内存中。
2.sql解析(加载SQL映射文件)
当API接口层接受到调用时,会接收传入SQL的id值和传入的对象(可以是int,map,javaBean),mybatis会根据id的值找到对应的MappedStatement对象,然后根据传入参数的对象对MappedStatement对象解析,解析之后得到最终要执行的sql语句和参数
3.sql执行
将最终得到的sql和参数拿到数据库执行,得到操作数据的结果
4.结果映射
将数据操作的结果按照映射的配置进行转换,可以转成javaBean,map或者基本数据类型,并将最终结果返回。
执行原理:是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。

二十、 JDBC和Mybatis性能效率哪个块?为什么

因为 mybatis 需要去映射,而映射是在内存完成的,所以效率比 jdbc 慢

二十一、MyBatis框架中用到了哪些设计模式?

单例模式:例如 ErrorContext 和 LogFactory。
工厂模式:例如 SqlSessionFactory、ObjectFactory。
代理模式:Mybatis 实现的核心,例如 MapperProxy、ConnectionLogger。
Builder 模式 :例如 SqlSessionFactoryBuilder、XMLConfigBuilder。
组合模式:例如SqlNode和各个子类ChooseSqlNode等
模板方法模式:例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler
适配器模式:例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现
装饰者模式:例如Cache包中的cache.decorators子包中的各个装饰者的实现
迭代器模式:例如迭代器模式PropertyTokenizer

二十三、MyBatis 一级缓存和二级缓存的区别

一级缓存:每一个SqlSession对象单独分配内存,多个SqlSession内存不共享,该缓存无需手动开启,直接使用
二级缓存:mybatis默认不开启,需要手动开启,它是mapper级别的缓存;同一个namespace下的所有操作语句,都影响着同一个Cache,即 二级缓存被多个SqlSession共享,是一个全局的变量

二十四、 MyBatis表关联时,如果有相同的列名,如何区分?

     表查询时增加as 别名方式 映射不同的属性名。

二十五、SpringMVC中的Bean是线程安全的吗? 说出你的解决方案?

不安全:因为Spring中的Bean默认是单例的,所以在定义成员变量时也有可能会发生线程安全问题,又因为成员变量是存放在堆内存中,而堆内存又是线程共享的,这就造成了线程安全问题

解决方式一:在对应的类名上加上该注解@Scope(“prototype”),表示每次调用该接口都会生成一个新的Bean。
解决方式二:使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。
解决方式三:尽量不要使用成员变量
解决方式四:前提:该程序是web应用,可以使用Spring Bean的作用域中的request,就是说在类前面加上@Scope(“request”),表明每次请求都会生成一个新的Bean对象。作用@Scope(“prototype”)类似。

二十六、 SpringMVC的执行流程?

简述运行流程
1.客户端发起请求到DispatcherServlet
2.由DispatcherServlet查找一个或多个HandlerMapping找到请求的handler(controller)
3.DispatcherServlet将请求提交到handler(controller)
4.Controller调用业务逻辑层处理后返回ModelAndView指定的视图
5.视图将结果返回给客户端

二十七、@RequestMapping注解作用

将请求和处理请求的控制器方法关联起来,建立映射关系
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

二十八、 @RequestBody 和@ResponseBody的区别

@RequestBody:作用在形参列表上,用于将前台发送过来固定格式的数据(xml 格式或者 json等封装)为对应的JavaBean对象,封装时使用到的一个对象是系统默认配置的HttpMessageConverter进行解析,然后封装到形参上
@ResponseBody:该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用

二十九、 @RequestParam和@PathViriable的区别=

  1. 用法上的不同, PathVariable只能用于接收url路径上的参数,而RequestParam只能接收请求带
    params 的
  2. 内部参数不同 ,PathVariable有value,name,required这三个参数,而RequestParam除此之外还多一个参数defaultValue
  3. PathVariable一般用于get和delete请求,RequestParam一般用于post请求。

三十、 @Resource和 @Autowired/ @Qualifier的区别

  • @Autowired 根据类型注入
  • @Resource 默认根据名字注入,其次按照类型搜索
  • @Autowired @Qualifier 根据Qualifier 的value注入实现类

三十一、 @Controller, @Service, @Repository,@Component作用

  • @Controller 用于标注控制层,负责注册一个bean 到spring 上下文中
  • @Service用于标注服务层,主要用来进行业务的逻辑处理,是类级别的注解,用于声明Service类
  • @Repository用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
  • @Component注解也就是“Controller注解”、“Service注解”和“Repository注解”的通用注解,可以
    和它们起到相同的作用

三十二、@Transactional注解作用

@Transactional注解可以作用于接口、接口方法、类以及类方法上

  1. 当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性
  2. 当作用在方法级别时会覆盖类级别的定义
  3. 当作用在接口和接口方法时则只有在使用基于接口的代理时它才会生效,也就是JDK动态代理,而不是
    Cglib代理
  4. 当在 protected、private 或者默认可见性的方法上使用 @Transactional 注解时是不会生效的,也不会抛出任何异常

三十三、 @Configuration注解作用

  1. 告诉spring这是一个配置类,相当于spring的xml配置文件
  2. 被@Configuration 注解的类,会被cglib代理进行增强
  3. @Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系,保证@Bean的对象作用域受到控制,避免多例

三十四、AOP的常用注解

@Aspect:把当前类声明为切面类。
@Before:把当前方法看成是前置通知。
@AfterReturning:把当前方法看成是始终通知
@AfterThrowing:把当前方法看成是异常通知。
@After:把当前方法看成是后置通知。
@Around:把当前方法看成是环绕通知。
@Pointcut:指定切入点表达式

三十五、描述 @ControllerAdvice @ExceptionHandler注解作用

ExceptionHandler, 方法注解, 作用于 Controller 级别.,为一个 Controler 定义一个异常处理器
ControllerAdvice, 类注解, 作用于 整个 Spring 工程. 定义了一个全局的异常处理器

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值