美文网首页
JAVA简答(四)

JAVA简答(四)

作者: 大脸猫猫脸大 | 来源:发表于2022-01-05 14:46 被阅读0次
    1. springmvc 和 struts 的区别是什么
    • 拦截机制的不同
      Struts2是类级别的拦截,每次请求就会创建一个Action。和Spring整合时ActionBean注入作用域是prototype;
      SpringMVC是方法级别的拦截,方法基本上是独立的。在Spring整合时,Controller Bean默认单例模式Singleton。
      所以,SpringMVC开发效率和性能高于Struts2。
    • 底层框架的不同:Struts2采用Filter实现,SpringMVC则采用Servlet实现。
    • 配置方面:spring MVC和Spring是无缝的。

    39.如何避免 sql 注入?

    • 什么是sql注入
      客户端用户输入的变量或URL传递的参数是组成SQL语句的一部分,通过SQL语句,实现无账号登录,甚至篡改数据库。
      如对语句select id, password from user where username=${username},如果传入的username值是;drop table user;,则解析成的sql为select id, password from user where username=;drop table user;,这会导致数据库被恶意篡改。
    • 如何避免sql注入
      ① PreparedStatement(采用预编译,简单又有效的方法)
      ② 使用正则表达式过滤传入的参数(是否包含特殊字符)
      ③ 检查变量数据类型和格式
    • 什么是sql预编译
      但是很多情况,一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同。对于这类情况,可以将sql语句模板化或者说参数化,将值用占位符替代,这就是预编译。预编译能够一次编译、多次运行,此外还能防止sql注入。
      简单总结,参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑。PreparedStatementmybatis都是采用预编译功能避免sql注入。
    • mybatis中的$#
      #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,而$将传入的数据直接显示生成在sql中,因此#方式能够很大程度防止sql注入。所以在编写MyBatis的映射语句时,尽量采用#{xxx}这样的格式。若不得不使用${xxx}这样的参数,要手工地做好过滤工作。
    1. spring 事务实现方式有哪些?
    • 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法。对基于 POJO 的应用来说是唯一选择。
    • 基于 TransactionProxyFactoryBean 的声明式事务管理
    • 基于 @Transactional 的声明式事务管理
    • 基于 Aspectj AOP 配置事务
    1. 什么是SpringMVC
    • SpringMVC的核心组件
      DispatcherServlet:中央控制器,把请求给转发到具体的控制类
      Controller:具体处理请求的控制器
      HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
      ModelAndView:服务层返回的数据和视图层的封装类
      ViewResolver:视图解析器,解析具体的视图
      Interceptors:拦截器,负责拦截我们定义的请求然后做处理工作
    • SpringMVC运行流程
      SpringMVC运行流程图
      ①用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
      DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回;
      DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter
      ④提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)
      Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
      ⑥根据返回的ModelAndView,选择一个适合的ViewResolver返回给DispatcherServlet
      ViewResolver 结合ModelView,来渲染视图;
      ⑧将渲染结果返回给客户端。
    • @RequestMapping
      RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性:
      value:指定请求的实际地址,指定的地址可以是URI Template 模式;
      method:指定请求的method类型, GET、POST、PUT、DELETE等;
      consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html
      produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
      params: 指定request中必须包含某些参数值是,才让该方法处理。
      headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
    1. 什么是SpringBoot?
      SpringBoot是一个框架,一种全新的编程规范,简化了Spring众多框架中所需的大量且繁琐的配置文件。所以 SpringBoot是一个服务于框架的框架,服务范围是简化配置文件,使编码变简单、配置变简单、部署变简单、监控变简单。
      Spring Boot提供了两种常用的配置文件,分别是properties文件yml文件
    2. 什么是 SpringCloud
      Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如
    • 服务发现——Netflix Eureka
      一个RESTful服务,用来定位运行在AWS地区的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
    • 客服端负载均衡——Netflix Ribbon
      主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。
    • 断路器——Netflix Hystrix
      断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
    • 服务网关——Netflix Zuul
      类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
    • 分布式配置——Spring Cloud Config
      这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。
    1. Mybatisf分页方式和延迟加载
    • #{}${}的区别
      #{}是预编译处理,调用PreparedStatementset方法来赋值,将sql中的#{}替换为?号。可以有效的防止SQL注入,提高系统安全性。
      ${}是字符串替换,就是把${}替换成变量的值;
    • 几种分页方式
      ①数组分页:查询出全部数据,然后再list中截取需要的部分
      ②sql分页:在查询sql中利用limit等方式限制返回条数
      ③拦截器分页:创建拦截器,拦截特定条件的语句。适合大数据量拦截。
      RowBounds分页:mybatis接口加入RowBounds参数。适合小数据量拦截。
    • 延迟加载
      Mybatis仅支持一对一一对多关联集合对象的延迟加载。在Mybatis配置文件中,lazyLoadingEnabled=true|false配置是否启用延迟加载。
      以用户订单(一对多)为例:

    在查询用户时,要不要把关联的订单信息查询出来?
    在查询订单时,要不要把关联的用户信息查询出来?

    对于第一个问题,应该是需要订单信息的时候才查询,没必要每次查询用户信息都把订单信息也查询出来。这就是延迟加载,在真正的使用数据时才发起查询,不用的时候不查。按需加载(懒加载)。
    对于第二个问题,我们就可以在查询订单信息的时候查询出关联的用户信息。这就是立即加载,不管用不用,只要一调用方法,马上发起查询。

    1. Mybatis缓存机制
      缓存机制减轻数据库压力,提高数据库性能,分为一级缓存和二级缓存
    • 一级缓存( sqlsesson 缓存)
      当第一次执行 select 完毕会将查到的数据写入 SqlSession 内的 HashMap 中缓存起来;第二次执行 select 的同传参数一样就会从缓存中查数据。
      注意:
      缓存的数据只在 SqlSession 内有效,当SqlSession 结束后那么他里面的一级缓存也就不存在了。
      HashMapSqlSession 会话对象用于存储缓存数据的,使用 [namespace:sql:参数] 作为 key,此 HashMap 是当前会话对象私有的。
      ③mybatis 默认开启一级缓存,不需要配置。
      ④如果 SqlSession 执行了 DML (insert、update、delete)操作并提交了,那么 mybatis 就会清空当前 SqlSession 缓存中的所有数据。
    • 二级缓存(mapper缓存)
      二级缓存与一级缓存其机制相同,默认也是采用 HashMap 存储,不同在于其存储作用域为 Mapper(Namespace)。当多个 SqlSession 使用同一个 Mapper 操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。二级缓存默认是没有开启的,需要在 setting 全局参数中配置。
      流程:
      ①当一个 sqlseesion 执行了一次 select 后,在关闭此 session 的时候,会将查询结果缓存到二级缓存
      ②当另一个 sqlsession 执行 select 时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能
    1. mybatis 执行器
      Mybatis有三种基本的执行器(Executor):
    • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
    • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。
    • BatchExecutor:执行update,将所有sql都添加到批处理中,等待统一执行。它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理
    1. mysql 常用的引擎
    • InnoDB 引擎
      ①提供了对数据库 acid 事务的支持
      ②提供了行级锁和外键的约束
      ③InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引
      ④不支持全文搜索,同时启动也比较的慢,不会保存表的行数
      ⑤适用于写多读少的情况
    • MyIASM 引擎
      ①不提供事务的支持
      ②不支持行级锁和外键,只有表锁
      ④保存了表的行数
      ⑤适用于读多写少的情况
    1. jvm 的主要组成部分?
    • 类加载器(ClassLoader):把 Java 代码转换成字节码
    • 运行时数据区(Runtime Data Area):把字节码加载到内存中
    • 执行引擎(Execution Engine):将字节码翻译成底层系统指令
    • 本地库接口(Native Interface):CPU 执行底层系统指令


      jvm运行时数据区

    相关文章

      网友评论

          本文标题:JAVA简答(四)

          本文链接:https://www.haomeiwen.com/subject/hhwqqrtx.html