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

本文详细介绍了SpringMVC的工作流程、常用注解及返回值方式,对比了SpringMVC与Struts2的区别,并分析了SpringMVC模式与拦截器实现。此外,还探讨了SpringBoot的核心注解、配置文件类型及其与SpringCloud的区别。在微服务领域,对比了SpringCloud与Dubbo的优劣,以及SoA和微服务的区别。同时,文章深入讲解了Mybatis的一级、二级缓存机制、自定义标签执行原理以及Mapper接口的工作流程。最后,解析了Hibernate的ORM概念、核心接口、工作原理和三级缓存策略,探讨了其优化措施和并发处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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.youkuaiyun.com/guan1843036360/article/details/123012816    

springboot:https://blog.youkuaiyun.com/mt776333/article/details/123447744

springcloud:https://blog.youkuaiyun.com/a6636656/article/details/124429257

mybatis:https://blog.youkuaiyun.com/javalingyu/article/details/124739040

hibernate:https://blog.youkuaiyun.com/lzqiang2011/article/details/113585319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值