1、常用的设计模式以及使用场景
    设计模式共有23种设计模式,分为
    创建型
    单例:spring
    工厂:beanfactory
    结构型
    代理:AOP
    组合:类中属性为类
    享元:integer属性-128到127在常量池获取
    适配器:就是不能直接使用,转换一下使用。例如webconfigureadapter
    装饰器:接口就是实现接口,然后调用他原来需要被装饰的类,加强功能。类就是子类继承修饰

    模板方法:RestTemplate
    策略:
    观察者:
    2、IOC底层实现原理
    IOC底层注入类主要有两个步骤,一个是bean的注册,一个是bean的实例化
    bean的注册是通过refresh方法,首先是根据加载容器的提供的文件名,通过resourceloader获取到resource对象,之后将流对象在转换为document对象,解析document对象,封装到beanfinished里面最后将对象的名字和对象的属性加入到一个concurrenthashmap中。
    bean的实例化是通过一个叫beanfinish的方法,过滤concurrent中的非懒加载的单例对象,进行实例化。
    3、Spring循环依赖如何解决
    循环依赖指A类依赖B类,B类依赖A类的情况,在spring中提供了三级缓存解决这个问题,三级缓存分别是一级缓存 sigletonObject.是一个concurrenthashmap,用于存放初始化完成的对象,二级缓存是earlysigletonObject
    用于存放没有属性赋值的早期对象,还有一个是sigletonfactories,用于存放工厂对象。在spring初始化对象时,假如A中依赖B,而B没有创建,他会在一级缓存先找,没找到就在二级缓存找,二级缓存已没有并且这个类是在创建的状态,就从三级缓存工厂创建一个早期对象返回到二级缓存。A类从二级缓存拿到早期对象,完成实例化。同时B类也创建,这时,一级缓存是有A类的完整对象,所以B类直接创建,B类完整对象创建完成,A类就可以。
    4、SpringBoot自动装配原理
    SpringBoot的自动装配原理,首先是启动类使用了SpringBootApplication。标记为启动类,这个注解里面有@componentscan ,用于扫描当前包及其子包,加入有注解的类到容器,@Springconfigure,作用是标记为配置类。最重要的一个是@enableautoconnfiguration 这个注解的作用是开启自动配置,它里面有一个叫做import的注解,强制导入了一个叫做Selectimport的类,这个类里面有一个selectimport方法,作用是找到matainf下的spring.factories。这个是会加载Spring自定义的配置类,配置类会找yml里面的配置。就实现了自动配置。
    5、Aop实现原理
    Aop底层实现是通过动态代理实现的,动态代理有两种,一个是jdk动态代理,一个是CGLIB动态代理,JDK动态代理只代理实现了接口的类,他是通过实现接口方法然后进行一个方法增强,CGLIB是代理没实现接口的类,主要是生成一个子类,实现方法的增强。