• 面试Java高级工程师之应用框架总结


    1. SpringMVC

      1. springmvc是什么
        1. springmvc是一个轻量级web框架,属于spring框架一个模块。通过一套注解,可以让一个普通java类成为一个能够接收请求控制器,而无须实现任何接口。同时还支持restful风格请求方式
      2. springmvc常用注解
        1. requestMapping、postMapping、getMapping、controller、restController、requestParam、responseBody
      3. springmvc执行流程
        1. 前端发起请求,通过DispatcherServlet前端控制器
        2. 找到对应映射器返回调用链
        3. 在请求处理适配器执行具体业务处理
        4. 返回视图解析器
        5. 视图渲染
      4. springmvc返回值有哪些方式
        1. void:可能是返回视图地址、重定向、转发
        2. string:默认请求url做为逻辑视图地址返回,加上requestBody返回空json/重定向/转发
        3. ModelAndView:指定视图名称、也可以绑定数据
        4. json:方法上添加@ResponseBody注解,通过HttpMessageConverter转成json返回,如果使用Jackson或Gson不需要提供实例,而使用Alibaba的Fastjson则需要手动提供HttpMessageConverter实例
      5. springmvc模式是什么
        1. mode:模型,用于为视图提供数据
        2. controller:控制器,用于接受前端发起请求,返回模型数据
        3. view:视图,用于前端与用户进行交互的页面
      6. springmvc与status2有什么区别
        1. springmvc入口是dispatchSevlet,status2是filter过滤器
        2. springmvc是基于方法开发,请求参数传递到方法的形参,struts2基于类开发,传递参数是通过类属性
        3. strtus是采用值栈存储请求和响应数据,springmvc通过request请求内容解析,并给方法形参赋值
      7. springmvc有哪些优点
        1. 实现数据验证、数据绑定机制
        2. 与spring框架结合,拥有aop切面和di依赖注入的特点
        3. 支持灵活的url到页面控制器的映射
        4. 支持restful风格
        5. 可以很方便的和其他视图技术jsp、freemarker整合
      8. springmvc拦截get方法怎么配置
        1. 在requestMapping注解指定get方式
        2. 使用getMapping注解
      9. SpringMVC拦截器怎么实现
        1. 通过实现HandlerInterceptor接口
        2. 继承HandlerInterceptorAdapter适配器类
      10. springmvc怎么解决post和get乱码问题
        1. post通过在web.xml文件中配置过滤器设置utf-8编码格式
        2. get通过设置tomcat编码格式或在代码中获取参数进行设置编码格式
      11. SpringMVC怎么样设定重定向和转发的
        1. 转发在返回值前面加"forward:"
        2. 重定向在返回值前面加"redirect:"
          1. java请求转发区别:
            1. 请求转发在服务器端完成的;重定向是在客户端完成的
            2. 请求转发的速度快;重定向速度慢
            3. 请求转发的是同一次请求;重定向是两次不同请求。
            4. 请求转发地址栏没有变化;重定向地址栏有变化
      12. springmvc主要组件
        1. 前端控制器
        2. 映射器
        3. 适配器
        4. 视图解析器
        5. 视图
      13. Spring MVC注解原理是什么
        1. 注解本质是一个继承了Annotation的特殊接口,具体实现类是Java运行时生成的动态代理类。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。从Java常量池memberValues这个Map中索引出对应的值
    2. SpringBoot

      1. springboot是什么
        1. springboot是spring下面一个子项目,提供spring组件一站式解决方案,主要是简化了配置,提供各种启动器,能够让开发人员快速上手开发
      2. springboot核心注解
        1. springbootApplication主要是用于开启自动配置,包含
          1. SpringBootConfiguration:实现了@configuration注解,实现配置文件的功能
          2. EnableAutoConfiguration:打开自动配置功能,通过exclude关闭自动配置
          3. ComponentScan:spring组件扫描
      3. springboot配置文件有哪几种,有什么区别
        1. .properties 和 .yml
        2. 书写格式不一样
        3. .yml 格式不支持@PropertySource 注解导入配置
    3. SpringCloud

      1. springcloud是一套微服务解决方案,不是框架也不是工具,它的核心思想是约定优于配置,基于springboot
      2. dubbo和springcloud区别
        1. 定位不同,springcloud提供的是微服务一站式解决方案,dubbo提供服务治理调用
        2. dubbo使用zookeeper,springcloud使用eureka
        3. dubbo性能是springcloud的3倍
        4. dubbo是阿里系,springcloud是springcloud社区,privotal公司开发
        5. springcloud提供服务网关、消息总线、批量任务、数据流,dubbo没有
        6. dubbo使用rpc调用方式,springcloud使用rest api
      3. soa和微服务区别
        1. soa:面向服务架构,他是一种设计方法,其中包含多个服务,服务之间通过相互依赖最终提供一系列功能。各个服务之间通过网络调用
        2. 微服务:微服务和soa架构类似,是在soa架构上进行改进的,微服务的核心重点就是业务完全的组件化和服务化。通过把原有的单个业务系统拆分成多个可以独立开发、部署、运行的微服务。
      4. rpc和restful区别
        1. rpc是一种远程调用协议,restful是一种设计风格
        2. rpc是基于tcp,restful基于http,可以使用xml或json格式定义
        3. rpc传输速度比restful更快,restful传输数据量比rpc更大
        4. restful的api是面向资源,对于同一个资源可以使用get、post、put进行操作,rpc直接体现在url接口地址上面
      5. rpc与http、tcp、udp、socket区别
        1. rpc是一种基于tcp的远程调用协议
        2. http是一种超文本传输协议,建立在tcp协议之上
        3. udp是一种传输协议,不需要进行连接,直接把信息封装成多个报文直接发送,所以udp比tcp传输更快,但数据可能会不完整
        4. tcp是一种传输协议,需要进行三次握手确认,四次挥手断开连接,通过流来传输数据
        5. socket是对tcp/ip协议的封装和应用,本质还是调用一个接口,方便使用tcp/ip协议栈而以,也支持其他网络协议
      6. dubbo为什么要用nacos而抛弃zookeeper(zookeeper和nacos区别)
        1. zookerper只支持cp模式,nacos支持ap和cp两种模式
        2. nacos服务端主动心跳机制优于zookeeper基于tcp探活(tcp活着但服务不一定活着)
        3. nacos客服端会缓存服务列表,当客户端不可用时可以起到容灾作用,zookeeper原生不具备
        4. zookeeper事务机制和二阶段提交性能远低于nacos
    4. Mybatis

      1. mybatis一级缓存和二级缓存的区别
        1. 一级缓存是sqlsession会话缓存,默认开启,第一次select查询结果会缓存到一级缓存,第二次查询就会先查询一级缓存,命中则返回,没有命中在查询数据库,只会执行一次sql。如果是先查询,在更新,在查询,则会执行三条sql,因为每次增删改会改变源数据,所以必须刷新缓存。
        2. 二级缓存是手动开启,在mybatis.xml文件setting中设置cacheEnabled为true开启全局二级缓存,如果是开启单个mapper则在mapper文件中添加标签。开启后查询则先查询二级缓存,如果有直接返回,没有在去一级缓存查找,如果一级缓存也没有则查数据库,返回值会先写入一级缓存,然后在写入二级缓存。
        3. 注意事项
          1. 开启全局缓存后所有select都会被缓存,所有增删改都会刷新缓存
          2. 使用最近最少用算法LRU清除不使用的缓存
          3. 缓存不会定时刷新
          4. 缓存保存列表或对象1024个引用
          5. 缓存被视为读/写缓存,这意味着获取的对象不是共享的,可以安全的被调用者修改,也不会干扰其他调用者或线程所做的潜在修改
      2. mybatis实现原理是什么
        1. 生成configuration
        2. 创建sqlSessionFactory
        3. 通过sqlsession获取mapper接口动态代理对象
        4. 调用executor去执行数据库相关操作
      3. #{}和${}的区别是什么
        1. #{}是占位符,在sql中会进行预编译,有效防止sql注入问题
        2. ${}是占位符,在sql中会被解析成动态sql语句,会发生sql注入情况
      4. mybatis自定义标签的执行原理什么,如if、when、where、set等
        1. 把定义的sql根据入参解析成sqlnode对象
        2. 再使用OGNL表达式计算结果
        3. 最后拼接sql片段
      5. mapper接口工作原理
        1. 解析select标签成mappedStatement对象
        2. 把标签中id与mapper接口方法相关联
        3. 每个mapper接口都会创建一个动态代理对象
        4. 代理类会拦截接口方法,找到mappedStatement对象
        5. 执行数据库操作
      6. 在Spring中Mapper接口是如何被注入的?
        1. 通过 SqlSession 的 getMapper(Class type) 方法
      7. Spring 中是如何将 Mapper 接口注入到其他 Spring Bean ?
        1. 实现 Spring 的BeanDefinitionRegistryPostProcessor 接口
      8. 在Mapper接口中是否可以有重载方法?
        1. 不可以,xml中id和mapper接口是唯一的
      9. 当实体类中的属性名和表中的字段名不一样 ,怎么处理
        1. 通过 AS 关键字
        2. 通过 来映射
        3. 开启 MyBatis 的mapUnderscoreToCamelCase配置
      10. mybatis如何获取MySQL自动生成的键值?
        1. 标签中添加useGeneratedKeys="true"属性和keyProperty指定主键字段
        2. 在标签内添加标签
      11. Mybatis有哪些Executor执行器?
        1. SimpleExecutor:每执行一次数据库操作就创建一个Statement对象,用完立即关闭
        2. ReuseExecutor:用sql作为key从map缓存中查找Statement对象,存在就使用,不存在就创建,重复使用
        3. BatchExecutor:批执行处理器,只支持update不支持select查询
        4. CachingExecutor:添加二级缓存功能
      12. Mybatis是如何进行分页的?分页插件的原理是什么?
        1. 使用RowBounds对象,针对ResultSet结果集执行内存分页
        2. 拦截待执行的sql,然后重写sql,根据dialect方言添加分页语句和参数
      13. ibatis和mybatis区别
        1. 配置文件根元素:iBatis 是 ,MyBatis是
        2. 存储过程的支持:ibatis是procedure标签,mybatis是select标签,由statementType属性标识存储过程
        3. 标签属性改变:select标签parameterClass属性改为parameterType属性
        4. 代码层面api改变:SqlMapClient 改为SqlSessionFactory
        5. 类型处理器接口改变:TypeHandlerCallback 改为了 TypeHandler
        6. 包迁移:DataSourceFactory移动到 org.apache.ibatis.datasource包下
      14. Mybatis动态sql执行原理?有什么作用?
        1. 执行原理是根据表达式的值完成逻辑判断并动态拼接sql
        2. 执行不同的条件查询sql
    5. Hibernate

      1. 什么是orm框架
        1. orm就是对象关系映射框架,即通过类与数据库表的映射,持久化到数据库
      2. 为什么要用hibernate?
        1. 封装JDBC访问数据库代码,无须重复编写
        2. 简化DAO层的编码工作
        3. hibernate映射很灵活,支持各种关系数据库
      3. hibernate核心接口有哪些
        1. session:负责被持久化对象CRUD操作
        2. sessionFactory:负责初始化hibernate,创建session对象
        3. configuration:负责配置并启动hibernate,创建SessionFactory
        4. transaction:负责事物相关的操作
        5. query和criteria接口:负责执行各种数据库查询
      4. Hibernate工作原理是什么
        1. 读取并解析hibernate核心配置文件、映射文件
        2. 创建sessionFactory
        3. 打开session
        4. 创建事务
        5. 持久化操作
        6. 提交事务
        7. 关闭session
        8. 关闭sessionFactory
      5. Hibernate三级缓存分别是什么
        1. session缓存:独享缓存,生命周期作用于session,缓存单个对象
        2. SessionFactory对象缓存:共享缓存,生命周期作用于整个应用,属于第三方,一般使用EhCache,需要手动开启,缓存单个对象
        3. 查询缓存:缓存一个结果集,需要手动开启,使用前提是必须开启二级缓存,在查询执行前调用query.setCacheable(true)
      6. 从session一级缓存读取对象的原理是什么?
        1. 生成key,通过对象全名+对象id值组合key
        2. 从一级缓存map中查找该key
        3. key存在就直接返回,不在发送sql
        4. 不存在就查找数据库,并存入map
      7. 为什么很少用三级查询缓存?
        1. 必须要一样的hql
        2. 存的是一个list,一个值改变就会影响整个list,效率低
        3. 只适用不能更改的list集合
      8. 什么样的数据适合存放到第二级缓存中?
        1. 很少被修改的数据
        2. 不是很重要的数据,允许出现偶尔并发的数据
        3. 不会被并发访问的数据
        4. 常量数据
      9. 缓存策略有哪些?
        1. read-only:只读模式
        2. read-write:支持并发的读写
        3. nonstrict-read-write:不锁的读写
        4. transactional:轻量级jave ee 不支持
      10. hibernate中本地线程怎么与session绑定?
        1. hibernate配置文件中开启thread
        2. 工具类中通过sessionFactory.getCurrentSession();
      11. Hibernate框架中设置事务的隔离级别
        1. 使用数字对应事务隔离级别,1-读未提交 2-读已提交 3-可重复读 4-串行化
        2. 在配置文件中进行事务属性配置hibernate.connection.isolation
      12. Hibernate是如何延迟加载?
        1. get方式,session缓存查找,然后二级缓存,如果都没有则查询数据库,数据库也没有则返回null
        2. load方式,分两种情况,在配置文件中lazy是否配置为true还是false,如果为false则和get方式一样,区别只是最终返回值为null的话就会抛出ObjectNot异常,如果是true,则从session查找,不存在则使用延迟加载,返回实体代理对象(CGLIB动态生成),当使用的时候在查找二级缓存和数据库,如果都没有则抛出ObjectNot异常
      13. SessionFactory是线程安全吗?
        1. 是,在hibernate中是单例数据存储和线程安全的,一个sessionFactory在启动的时候只会创建一次
      14. hibernate 有几种查询方式?
        1. HQL查询
        2. Criteria查询
        3. SQLQuery本地SQL查询
      15. hibernate 实体类可以被定义为 final 吗?
        1. 可以,但会影响提升性能,定义为final后hibernate就会不是代理对象
        2. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
        3. 使用integer当数据库字段为空时返回null,而使用int时会抛出类型转换异常
      16. get()和 load()的区别?
        1. get数据库没有数据会返回null,load会抛出异常
        2. get永远返回有实体对象,load会返回没有加载数据的代理类实例
      17. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
        1. getCurrentSession会绑定当前线程,而openSession不会
        2. getCurrentSession事务由spring控制,openSession需要手动开启提交
        3. getCurrentSession不需要我们手动关闭,由sessionFactory管理,openSession需要手动关闭
      18. hibernate 实体类必须要有无参构造函数吗?为什么?
        1. 必须,因为hibernate是通过构造函数来构造实例对象,即Class.forname的newInstance方法。单从hibernate角度来说是通过反射机制来生成实例对象,所以必须要有构造函数
      19. 如何优化Hibernate?
        1. 使用双向一对多关联,不使用单向一对多
        2. 不用一对一,用多对一取代
        3. 配置对象缓存,不使用集合缓存
        4. 表字段要少,表关联不要怕多
      20. 比较hibernate的三种检索策略优缺点?
        1. 立即检索,优点:实时查询,不管对象是持久还是游离状态,缺点:select语句太多,可能会加载不需要的对象
        2. 延迟检索,优点:避免select语句太多,由应用程序决定需要加载哪些对象,缺点:如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化
        3. 迫切左外连接检索,优点:使用了外连接,select语句数目少,缺点:复杂的数据库表连接也会影响检索性能
      21. 什么是Hibernate的并发机制?怎么去处理并发问题?
        1. Hibernate的Session对象是非线程安全的,它通常只使用一次, 然后就丢弃。多个事务并发访问同一块资源,可能会引发丢失更新,脏读,幻读,不可重复读的问题
        2. 解决方案:设置事务隔离级别。设置锁:乐观锁和悲观锁。hibernate可以配置optimistic-lock=”all”比较一行纪录每个字段的状态

    参考连接:

    springmvc:https://blog.csdn.net/guan1843036360/article/details/123012816    

    springboot:https://blog.csdn.net/mt776333/article/details/123447744

    springcloud:https://blog.csdn.net/a6636656/article/details/124429257

    mybatis:https://blog.csdn.net/javalingyu/article/details/124739040

    hibernate:https://blog.csdn.net/lzqiang2011/article/details/113585319

  • 相关阅读:
    ChatGPT数据集之谜
    TCP协议的三次握手及其原因
    【已解决】matrix contains invalid numeric entries,记录bug修改
    java毕业生设计大学生网络创业就业管理系统计算机源码+系统+mysql+调试部署+lw
    一个C#跨平台的机器视觉和机器学习的开源库
    如何借助数据集更好的评估NLP模型的性能?
    数学建模笔记
    Odoo:行业领先的免费开源财务管理解决方案
    KEIL/MDK中的标准C库函数printf和malloc实现线程安全
    JDK中常见的设计模式
  • 原文地址:https://blog.csdn.net/biao_java/article/details/126087813