首页 > 技术文章 > 2018-02-24电话面试总结

alcc 2018-02-24 21:11 原文

记一次电话面试。

先抛出题目:

1. 应用怎么知道spring已经加载好了
2. beanfactory  factorybean区别
3. mybatis 防止sql注入
4. redis在项目中是做什么的,有哪几种基本的对象类型,缓存如何保持数据一致性
5. 多线程交换两个线程的数据方式
6. 你最深入学习的项目

 

 

 

 

下面是具体回顾细节:

  • 应用怎么知道spring已经加载好了
        spring上下文初始化完后会触发事件,发出通知;使用自定义的类继承实现ApplicationListener.onApplicationEvent()即可。
  • beanfactory  factorybean区别
        BeanFactory是个 Factory ,也就是 IOC 容器或对象工厂, FactoryBean 是个 Bean 。在 Spring 中,所有的 Bean 都是由                            BeanFactory( 也就是 IOC 容器 ) 来进行管理的。但对 FactoryBean 而言,这个 Bean 不是简单的 Bean ,
          而是一个能生产或者修饰对象生成的工厂 Bean, 它的实现与设计模式中的工厂模式和修饰器模式类似。
  • mybatis 防止sql注入
       通过转义符号#会对传入的数据进行PreparedStatement预编译。
        通过$则不进行转义
  • redis在项目中是做什么的
        作为内存缓存
  • 有哪几种基本的对象类型
        对象类型有
        String,
        Hash,
        List,
        Set,
        Sorted set,
        pub/sub,
        Transactions
  • 缓存如何保持数据一致性
        缓存内容与数据库的一致性,这里一般有两种做法:
只在数据库查询后将对象放入缓存,如果对象发生了修改或删除操作,直接清除对应缓存(或设为过期)。
在数据库新增和查询后将对象放入缓存,修改后更新缓存,删除后清除对应缓存(或设为过期)。
  • 多线程交换两个线程的数据方式
            静态数据变量可以交换数据
            通过Exchanger也可以进行交换。
  • 你最深入学习的项目
            讲了下CAS的项目的设计。
 
总结:
从面试官问的问题可以联想出来的问题:
  • ApplicationListener.onApplicationEvent()什么时候被调用,被谁调用。
  • spring 的启动的时候的调用链是怎么样的
  • factorybean应用场景
  • beanfactory初始化流程
  • redis的每个数据类型的作用及其应用场景
  • Exchanger项目的应用场景
 
  • spring 的启动的时候的调用链是怎么样的ApplicationListener.onApplicationEvent()什么时候被调用,被谁调用。 
    答:入口启动代码如下
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:application-context.xml");

容器启动 时序图 

参见链接:http://blog.csdn.net/yamorn/article/details/44078377 
org.springframework.context.support.AbstractApplicationContext.finishRefresh()中发出了事件通知

 

 

  • factorybean应用场景
    •  org.springframework.beans.factory.FactoryBean<T>是一种特殊的Bean,跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。
    • FactoryBean 通常是用来创建比较复杂的bean,一般的bean 直接用xml配置即可,但如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean。
    • FactoryBean有三个实现方法:
      • Object getObject():返回本工厂创建的对象实例。此实例也许是共享的,依赖于该工厂返回的是单例或者是原型。
      • boolean isSingleton():如果FactoryBean返回的是单例,该方法返回值为true,否则为false
      • Class getObjectType():返回对象类型。对象类型是getObject()方法返回的对象的类型,如果不知道的类型则返回null。
    • 当使用ApplicationContext的getBean()方法获取FactoryBean实例本身而不是它所产生的bean,则要使用&符号+id。比如,现有FactoryBean,它有id,在容器上调用getBean("myBean")将返回FactoryBean所产生的bean,调用getBean("&myBean")将返回FactoryBean它本身的实例。
    •  经典的factorybean应用场景:搭配InitializingBean的afterPropertiesSet使用,在初始化bean的时候执行。
    • 具体的例子见:https://www.jianshu.com/p/b9439edb8408
  • beanfactory是什麽。
    • BeanFactory接口定义了ioc容器的最基本的形式,并且提供了ioc容器所应该遵守的基本的服务契约,同时,这也是我们使用ioc容器所应该遵守的最顶层和最基本的编程规范,这些接口定义勾画了ioc的基本轮廓,很显然,在Spring的代码实现中,BeanFactory只是一个接口类,并没有
    • ApplicationContext是 spring 中较高级的容器。它扩展了BeanFactory接口,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。 另外,它增加了企业所需要的功能,比如,从属性文件从解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。

 

面试总结:

面试开始的时候找了一会儿建立,很致命,在约好时间前要找到自己的简历。
面试的时候的介绍要自己准备准备,面试官会按照这个来准备问题来问。

 

推荐阅读