zoukankan      html  css  js  c++  java
  • java常见面试题(一)

    一、Spring面试的问题

      1、spring的事务认识

        事务注解方式: @Transactional,当标于类前时,该类的所有public方法都进行事物处理。

        事务的传播行为:

          @Transactional(propagation=Propagation.REQUIRED)
          如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
          @Transactional(propagation=Propagation.NOT_SUPPORTED)
          容器不为这个方法开启事务
          @Transactional(propagation=Propagation.REQUIRES_NEW)
          不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
          @Transactional(propagation=Propagation.MANDATORY)
          必须在一个已有的事务中执行,否则抛出异常
          @Transactional(propagation=Propagation.NEVER)
          必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
          @Transactional(propagation=Propagation.SUPPORTS)
          如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
          @Transactional(propagation=Propagation.NESTED)
          如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效.

        事务隔离级别:

        islation:该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置mysql默认是:REPEATABLE_READ
        @Transactional(isolation = Isolation.READ_UNCOMMITTED)
        读取未提交数据(会出现脏读, 不可重复读) 基本不使用
        @Transactional(isolation = Isolation.READ_COMMITTED)
        读取已提交数据(会出现不可重复读和幻读)
        @Transactional(isolation = Isolation.REPEATABLE_READ)
        可重复读(会出现幻读)
        @Transactional(isolation = Isolation.SERIALIZABLE)
        串行化(可避免脏读、不可重复读、幻读的发生)

      2、spring mvc的执行流程

        1.发送请求到DispatcherServlet(前端控制器)

        2.DispatcherServlet请求HandleMapping(处理器映射器)查找Handle(Handle就是我们所说的Controller)并返回给DispatcherServlet

        3.前端控制器调用HandlerAdapter(处理适配器去)执行Handle

        4.Handle执行完毕向HandlerAdapter返回ModelAndView

        5.HandlerAdapter向DispatcherServlet返回ModelAndView

        6.DispatcherServlet解析ModelAndView渲染视图并向用户响应结果

      3、Spring Ioc(控制反转)基于java反射机制

        功能:最主要是完成了完成对象的创建和依赖的管理注入等等。把我们原先需要在代码里实现对象创建、依赖的代码,反转给容器来帮忙管理。解耦。

        如果对象A要用到对象B,A需要新NEW一个B,这样是A主动的去获得B,A依赖于B,他们具有依赖关系,如果用spring,在A需要用到对象B的时候,是根据配置,容器主动生成B,注入到对象A中,这样从主动获取B变成了被动,就实现了解耦。就如主板接口在那,他不会要求我必须插具体的某个显卡,而只是符合接口的显卡就可以了,这个决定权归组装的人决定。把修改硬编码变成修改配置文件。后者要好维护、好部署、清晰、集中得多。

        三种注入方式:接口注入、setter注入、构造方法注入,使用@Autowired(省略set方法、构造函数等)完成自动注入

      4、Spring Aop(面向切面编程)基于动态代理实现

        关于动态代理和静态代理可查看http://www.cnblogs.com/lkf-00889/p/7382122.html

        功能:找出对多个对象产生影响的公共行为,将其封装为一个可重用的模块,这个模块被命名为切面(@Aspect),切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

        5中通知函数:前置通知@Before、后置通知@AfterReturning 、异常通知 @AfterThrowing、最终通知 @After、环绕通知@Around 

        

    @Aspect//定义为切面类
    @Component//spring标识的bean
    @Order(1)//先执行,数字越小执行越早
    public class WebLogAspect {
    
        @Pointcut("execution(* com.lkf.controller.*.*(..))")//切入点
        public void webLog(){
    
        }
    
        @Before("webLog()")
        public void beFore(){
            System.out.println("执行之前执行。");
        }
    }

        

    二、Mybatis面试的问题

      1.mybatis和hibernate的区别

        (1)mybatis学习简单上手比hibernate简单些。

           (2)Hibernate对数据库结构提供了较为完整的封装。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。mybatis则需要自己编写sql语句。

           (3)Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。

           (4)Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

          2.mybatis中#和$的区别

         在传参数的时候用#{},在传表名或者order by 某个字段的时候用${},因为#{}会自动加上“”而${}是传什么拿什么。

         #{}可以在很大程度上防止sql注入比${}安全

    三、spring boot

      1.好处

        (1)独立运行的的spring项目。spring boot可以以jar包的形式独立运行,也可以在应用项目的主程序中运行main函数即可。

           (2)内嵌Servlet容器

           (3)提供start简化Maven配置,帮我们整合了大量的第三方框架

           (4)简化了xml配置,项目搭建快速

         

        

  • 相关阅读:
    C/S 随思录
    3dTiles 最后一块拼图:几何误差与屏幕空间误差
    aps.net cannot connect to runtime process
    asp.net web api swagger使用总结
    asp.net webaip 跨域
    LightGBM算法实践
    Zabbix 机器 CPU 飙高 和 时区相差8个小时
    【vue踩坑记录】3、“Error in render: "TypeError: Cannot read property '0' of undefined"”渲染错误问题
    1-关于补码的理解
    vscode快捷键
  • 原文地址:https://www.cnblogs.com/lkf-00889/p/7360181.html
Copyright © 2011-2022 走看看