Java求职面试必会框架知识(Mybatis/Spring/SpringMVC)

1. Mybatis框架     

        1.1 谈一谈你对Mybatis框架的理解(了解)
       MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

       1.2 在mybatis中,${} 和 #{} 的区别是什么?(必会)
        #{} 是占位符,预编译处理,${}是字符串替换。
       Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
       Mybatis在处理${}时,就是把${}替换成变量的值。
       使用#{}可以有效的防止SQL注入,提高系统安全性。

       1.3 MyBatis编程步骤是什么样的?(了解)
         1、 创建SqlSessionFactory
         2、 通过SqlSessionFactory创建SqlSession
         3、 通过sqlsession执行数据库操作
         4、 调用session.commit()提交事务
         5、 调用session.close()关闭会话

       1.4 在mybatis中,resultType和ResultMap的区别是什么?(必会)
        如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性
        如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过resultMap手动建立对象关系映射,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来

        1.5 在Mybatis中你知道的动态SQL的标签有哪些? 作用分别是什么?(必会)
          1. <if>if是为了判断传入的值是否符合某种规则,比如是否不为空.
          2. <where> where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类型where 1 = 1这种无用的条件
          3. <foreach> foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中.
          4. <include> include可以把大量的重复代码整理起来,当使用的时候直接include即可,减少重复代码的编写;
          5. <set>适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作

       1.6 谈一下你对mybatis缓存机制的理解?(了解)
       Mybatis有两级缓存一级缓存是SqlSession级别的,默认开启,无法关闭;
                                          二级缓存是Mapper级别的,二级缓存默认是没有开启的,但是手动开启
       1. 一级缓存:基础PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,Session中的所有Cache就将清空
       2. 二级缓存其存储作用域为Mapper(Namespace),使用二级缓存属性类需要实现Serializable序列化接口
       3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有select中的缓存将被clear.
       需要在setting全局参数中配置开启二级缓存,如下conf.xml配置:
file:///C:\Users\谁动了~1\AppData\Local\Temp\ksohtml752\wps17.jpg
       当我们的配置文件配置了cacheEnabled=true时,就会开启二级缓存,二级缓存是mapper级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库。

2. Spring框架
       2.1 Spring的两大核心是什么?谈一谈你对IOC的理解? 谈一谈你对DI的理解? 谈一谈你对AOP的理解?(必会)
        1. Spring的两大核心是:IOC(控制反转)和AOP(面向切面编程) DI(依赖注入)
        2. IOC的意思是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。最直观的表达就是,IOC让对象的创建不用去new了,可以由spring根据我们提供的配置文件自动生产,我们需要对象的时候,直接从Spring容器中获取即可.
        Spring的配置文件中配置了类的字节码位置及信息, 容器生成的时候加载配置文件识别字节码信息, 通过反射创建类的对象.
Spring的IOC有三种注入方式 :构造器注入, setter方法注入, 根据注解注入。
        3. DI的意思是依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖Io c容器来动态注入对象需要的外部资源。
        4. AOP,一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect). SpringAOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
        5. Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理
          (1)JDK 动态代理只提供接口代理,不支持类代理,核心 InvocationHandler 接口和 Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起,Proxy 利用 InvocationHandler 动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
          (2) 如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP会选择使用 CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

        2.2 Spring的生命周期?(高薪常问)
      1. 实例化一个Bean,也就是我们通常说的new
      2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
      3. 如果这个Bean实现dao了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
      4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
      5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
      6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
      7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
      8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
      9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
     10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

      2.3 Spring支持bean的作用域有几种吗? 每种作用域是什么样的?(必会)
      Spring支持如下5种作用域:
     (1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
     (2)prototype:每次请求都会为bean创建实例。
     (3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
     (4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
     (5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。

     2.4 BeanFactory和ApplicationContext有什么区别(了解)
       BeanFactory:
            Spring最顶层的接口,实现了Spring容器的最基础的一些功能, 调用起来比较麻烦, 一般面向Spring自身使用
            BeanFactory在启动的时候不会去实例化Bean,从容器中拿Bean的时候才会去实例化
       ApplicationContext
            是BeanFactory的子接口,扩展了其功能, 一般面向程序员身使用
         

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值