1、什么是自动装配,有哪些方式

  spring会自动中上下文中寻找并给bean装配与其相关的属性
  自动装配方式
    1、byName:把与bean的属性具有相同名字的其他bean自动装配到bean的对应属性中
    2、byType:把与bean的属性具有相同类型的其他bean自动装配到bean的对应属性中(若有多个, 则抛出异常)
    3、contratc(构造器):把与bean的构造器入参具有相同类型的其他bean自动装配到bean的构造器的对应入参中(查找时通过bean的类型来确定)
    4、autodetect:先尝试使用contructor进行自动装配,如果失败再尝试使用byType(不推荐使用)
    5、no(默认):不进行自动装配,通过显式设置ref属性来进行装配
2、对象创建的过程

  1、类加载检查:检查能否再常量池中定位到这个类的符号引用,并检查是否被加载、解析和初始化,如果没有,先执行类加载过程

  2、分配内存:为创建出来的对象分配内存,内存大小在类加载完成后便可确定。分配内存的方式有两种:

    1)指针碰撞:内存连续,已分配的和未分配的内存使用指针分割,每次将指针移动一个对象占用的大小
    2)空闲列表:内存不连续,用集合存储所有可用内存碎片的地址,每次给对象分配内存时,找一个足够大小的内存碎片来存储
  3、初始化:为对象的成员变量和静态变量赋初始值
  4、设置对象头:对象分为对象头、对象数据、对齐填充。对象头包括mark word(锁信息、gc分代年龄、hashcode)、class point(类元信息的指针)
  5、执行init方法:为对象的变量赋真正的值

3、DCL(双重检查锁)单例模式需不需要volatile

  需要。防止因为指令重排序而获取到未初始化完成的对象
4、对象在内存中的布局(对象与数组的不同)

  对象:对象头(mark word、class point)、对象数据、对齐填充
  数组:对象头(mark word、class point、数组长度)、数据、对齐填充

5、对象头包括什么

     mark word(锁信息、gc分代年龄、hashcode值)、class point(类元信息指针)、(数组还包含数组长度)
6、对象怎么定位

  句柄访问、直接指针访问
7、对象怎么分配

  1、尝试分配到栈中(对象无逃逸),分配到栈中的对象无需GC,随方法结束而销毁
  2、无法分配到栈中,如果对象过大,直接分配到堆中的Old区
  3、小对象,线程私有本地分配(TLAB)
  4、TLAB失败,分配到Young区中的Eden区
  5、经过Survivor区的翻转,最后进入Old区

8、一个Object占多少字节

  16
9、class实例在方法区还是堆中

  在堆中

10、BeanFactory和ApplicationContext的区别

  相同:都可以做为Spring的容器,ApplicationContext是BeanFactory的子接口
  不同:
    1、BeanFactory是延迟加载,ApplicationContext容器启动时就会创建所有bean
    2、ApplicationContext提供在监听器中注册bean的事件
    3、ApplicationContext支持国际化
    4、对于BeanPostProcessor、BeanFactoryPostProcessor,ApplicationContext是自动注册,BeanFactory是手动注册

11、mybatis插件运行原理和开发流程 

  mybatis四大组件:Executor、StatementHandler、ParameterHandler、ResultSetHandler
  mybatis框架对四大组件提供了简单易用的扩展机制,支持使用插件对四大核心组件进行拦截。本质上借助底层的动态代理。
  原理:
    1)每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll()
    2)获得所有的Interceptor,调用interceptor.plugin()返回target封装后的对象
    3)使用插件为目标对象创建代理对象,AOP四大核心组件,然后拦截对象的每一次执行
  开发插件:使用@Intercepts注解

12、mybatis的优缺点

  优点:
    1)简单易学
    2)与jdbc相比,减少了大量冗余代码
    3)sql与代码分离,降低耦合度
    4)可手写sql,较灵活
    5)可编写动态sql
    6)通过映射标签,支持对象与数据库字段的ORM映射
  缺点:
    1)sql编写工作量大
    2)sql语句依赖数据库,数据库移植性差

13、mybatis和hibernate的区别

  1)mybatis易上手
  2)mybatis是半自动orm框架,hibernate是全自动orm框架
  3)mybatis sql写着xml文件中,较灵活,方便优化
  4)hibernate有更完善的缓存和日志机制
  5)hibernate数据库移植性好,mybatis较差

14、mybatis中${}和#{}的区别

  ${}是字符串拼接(statement),会引起sql注入,#{}是占位符(prepareStatement)
15、spring、springMVC、springboot的区别 

  spring是一个容器,整合各种框架。
  springMVC是spring下的专注于web层的框架。
  springboot是spring的快速开发包,可简化配置,快速整合其他框架的脚手架

16、springboot自动装配的原理

  从@SpringBootApplication注解看起,它由多个注解组成,主要注解包括三个@SpringBootConfiguration、@ComponentScan和@EnableAutoConfiguration
@SpringBootConfiguration注解同样由多个注解组合而成,主要注解为@Configuration,声明此为配置类。
@ComponentScan注解为组件扫描注解,扫描启动类的同级路径及子路径的组件。
@EnableAutoConfiguration注解同样是组合注解,主要包括@AutoConfigurationPackage和@Import两个注解,进入@AutoConfigurationPackage注解,发现导入了一个注册类AutoConfigurationPackages.Registrar.class,将启动类所在包及子包下的所有组件扫描到Spring容器中。回到@EnableAutoConfiguration并进入@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector.class实现了ImportSelector接口并重写了selectImports方法,查找META-INF/spring.factorie文件,并根据文件中的路径加载对应的配置类

17、springMVC的工作流程

  1、用户发起请求到前端控制器(DispatcherServlet)
  2、前端控制器请求处理器映射器(HandlerMapping)返回执行链
  3、将执行链发送给处理器适配器(HandlerAdaptor)
  4、交由处理器(Handler)执行后返回ModelAndView对象
  5、通过视图解析器(ViewResolver)解析后返回View
  6、渲染视图
  7、返回给用户 

18、spring事务的传播方式

  REQUIRED:有事务加入这个事务,没有事务创建新的事务
  REQUIRED_NEW:创建新的事务,当前存在事务则将事务挂起
  SUPPORTS:使用当前事务,无事务则不使用事务
  NOT_SUPPORTS:不使用事务,当前存在事务则挂起
  MANDATORY:使用当前事务,不存在则抛异常
  NEVER:不使用事务,有事务则抛出异常
  NESTED:当前存在事务,则嵌套事务,不存在则创建新的事务

19、spring核心

  AOP:面向切面编程的思想,减少重复代码,降低耦合性,提高维护性。
  IOC:控制翻转,将对象交由spring容器创建
  DI:依赖注入,创建对象时自动设置所需要的值

20、springMVC的九大内置组件

  HandlerMapping:处理器映射器
  HandlerAdapter:处理器适配器
  HandlerExceptionResolver:异常处理器
  ViewResolver:视图解析器
  LocaleResolver:当前环境处理器(国际化)
  ThemeResolver:主题处理器
  RequestToViewNameTranslator:视图名称翻译器
  MultipartResolver:文件处理器
  FlashMapManager:参数传递处理器(重定向中传递参数)

21、spring单例bean是否线程安全

  spring框架并没有对bean进行多线程的封装处理,如果单例bean是无状态的,则不存在线程安全问题,如果是有状态的,则是线程不安全的。