经典面试题8(IOC 和 AOP,设计模式,Spring Bean 的生命周期,延迟加载,多级缓存机制)

目录

1,Spring 的 IOC 和 AOP 是什么,有哪些优点?

2,Spring 框架用到了哪些设计模式?

3,介绍 Spring Bean 的生命周期

4,MyBatis 如何实现延迟加载?

5,介绍 MyBatis 的多级缓存机制


1,Spring 的 IOC 和 AOP 是什么,有哪些优点?

        在使用 Spring框架的过程中,其实就是为了使用 IOC(控制反转)、依赖注入(DI与IOC一样)和AOP(面向切面编程),这两个也是 Spring 的灵魂。,Spring的 IoC容器是 Spring的核心,Spring AOP是 Spring框架的重要组成部分。

IOC:

        IOC为控制反转,把创建管理对象的工作交给容器来做。在容器初始话的时候,通过反射机制创建好对象,在使用的时候直接从容器中获取。

        控制反转:将对象的控制权反过来交给容器管理。

        IOC的实现方式有依赖注入和依赖查找两个方法,依赖查找相对于依赖注入使用的较少,因此IOC也有时候被叫做依赖注入。依赖注入:将对象依赖写入配置文件,在创建有依赖关系的对象的时候,有IOC容器来注入依赖的兑现。构造器注入,setter方法注入。

        实现原理:

        反射+XML,根据配置文件中给出的类名生成相应的对象。

  1. Tomcat启动Spring容器;
  2. 初始话Spring容器,加载application.xml配置文件;
  3. 获取扫描包下所有的class文件;
  4. 解析class中的注解信息;
  5. 通过反射实例化相应bean对象,以的形式保存集合,存储在IOC容器中;
  6. 通过ApplicationContext的getBean方法获取Bean。

        优点:

         创建Bean及其依赖对象的工作交给IOC容器管理,业务代码只需要getBean就行了。将依赖关系写入配置文件中,有修改时,直接修改配置文件即可,而不用去业务代码中每一个使用Bean的地方修改。

        总结起来就是:将对象统一管理,降低耦合。

AOP:

        AOP是面向切面编程,将一些系统相关的,比如说日志,事务,安全的工作,独立的 提取出来,独立实现,作为一个公共切面切入到相关的业务逻辑当中。

        将业务逻辑代码与公共功能代码分离开,使开发人员可以更加专注的编写业务逻辑代码。

        Spring的事务支持是由AOP(面向切面编程)这一思想做支撑,然而面向切面编程底层的落地实现是Spring工厂的动态代理,而Spring底层又对JDK或cgLib这两种实现动态代理的方式做了封装,Spring可以利用AOP思想实现事务、日志、性能监控

        应用场景:事务(数据库更新),权限(web请求权限),日志(每一次记录更新)等。

        实现方式:

        1,XML方式

        普通工程通过new ClassPathXmlApplicationContext("applicationContext.xml")初始化Spring。

        在执行DogService类中的方法时,执行前会先执行PointCutXmlConf类中的beforeAdvice方法,执行后会执行PointCutXmlConf类中的afterAdvice方法。

        2,注解方式

        @Aspect 指定一个类为切面类

        @Component 加入容器

        优点:

        作用:为原始的对象可以增加额外的功能,解耦合,便于原始对象的维护。

2,Spring 框架用到了哪些设计模式?

1,工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例。

2,单例模式:Bean默认为单例模式。

3,代理模式:Spring的AOP用到了JDK的动态代理和CGLIB字节码生成技术。

4,模板模式:用来解决代码重复问题,比如,RestTemplate,JmsTeplate,JpaTemplate。

5,观察者模式:定义的对象间存在一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新。

3,介绍 Spring Bean 的生命周期

        Servlet的生命周期就是Bean从创建到销毁的过程:实例化,属性赋值,初始化,销毁。

       1,实例化

                通过反射来推断构造函数进行实例化

                实例化工厂,静态工厂

        2,属性赋值

                解析自动装配,方式(byname bytype constractor none @Autowired)

                循环依赖

        3,初始化

                调用—Aware回调方法(BeanNameAware,BeanClassLoaderAwar,BeanFactoryAwre等)

                调用初始化生命周期回调(注解,intiializingBean接口,注解属性)

                如果bean实现了aop,创建动态代理

        4,销毁

                在spring容器关闭的时候进行调用

                调用销毁生命周期回调(注解,intiializingBean接口,注解属性)

4,MyBatis 如何实现延迟加载?

        延迟加载,为懒加载,指在进行表的关联查询的时候,按照设置延迟规则的关联对象的select查询。(用的到的数据才进行查询加载,用不到的不进行加载。)

        原理:

        使用代理对象,在访问未加载的数据时触发代理对象的方法,从而进行数据的加载。

        主要是通过动态代理来实现,给用户返回一个代理类(A),思想就是确定什么时候加载,也就是确定应该条件来调用方法,比如,调用getB这个方法,代表要获取B这个集合,此时就执行加载工作,这个拦截工作在代理对象中完成,最终完成数据库的操作,加载对象。

        生成代理对象的方法使用的是CGLIB。

        优点:

        先从表单查询,需要时从关联表查询,大大的提高了数据库的性能,因为查询表单要比关联查询多张表速度快很多。

        缺点:

        因为只有在用得到数据时 才会查询数据库,这样在处理大批数据的时候,查询会消耗大量的时间,使得响应时间慢。

5,介绍 MyBatis 的多级缓存机制

        MyBatis有一级缓存和二级缓存。

        一级缓存:本地缓存,是Session会话级别的,一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下是开启的,而且不能关闭。

        二级缓存:针对mapper进行缓存,它的生命周期很长,跟Application的生命周期一样,也就是说作用范围是这个Application应用。默认是不开启的,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化。

        一级缓存原理:

        生成一个SqlSeesion对象,一个SqlSession对象会使用一个Executor对象和一级缓存来完成会话操作,Executor对象会维护一个Cache缓存,用来提高性能。

        客户端发出请求,首先会发送请求给SqlSession,Executor会将请求发给一级缓存(map),从一级缓存取出数据。但是,如果一级缓存中没有数据,就将一级缓存中全部清空,去数据库中查找,将数据写入缓存。

        二级缓存原理:

        二级缓存就是在一级缓存的基础上,对Executor对象进行改造。 会给Executor对象加上一个装饰者,CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作。首先,会先判断请求在Appliction级别的二级缓存是否有缓存结果,如果有直接返回。如果缓存之中没有结果,再交给Executor对象来完成查询操作,之后CachingExecutor会将Executor返回的结果存放在缓存之中,然会给用户。

你可能感兴趣的:(面试题,java,mybatis,spring)