SSM常见面试题

SSM常见面试题

    • 1.spring bean 容器的生命周期是什么样的?
    • 2.BeanFactory 和 ApplicationContext 的区别?
    • 3.spring 的特性?谈谈你对 spring 的理解?spring 用来干嘛?
    • 4.jdk 的动态代理和 cglib 动态代理有什么区别?
    • 5.aop 的实现原理?
    • 6.springmvc 的原理?springmvc 的工作流程?
    • 7.springmvc 的常用注解有哪些?
    • 8.mybatis 使用了哪些设计模式?你了解过哪些设计模式?

1.spring bean 容器的生命周期是什么样的?

  1. 实例化一个Bean--new
  2. 按照Spring上下文对实例化的Bean进行配置--IOC注入
  3. 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,传递Spring配置文件中Bean的id值
  4. 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
  5. 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
  6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
  7. 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
  8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

     :以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例。

  1. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
  2. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

2.BeanFactory 和 ApplicationContext 的区别?

  1. ApplicationContextBeanFactory子接口
  2. BeanFactory:bean工厂接口;负责创建bean实例;容器里面保存的所有单例bean其实是一个map;Spring最底层的接口
  3. ApplicationContext:是容器接口;更多负责容器功能的实现;(可以基于BeanFactory创建好的对象之上完成强大的容器)
  4. BeanFactory是最底层的接口,ApplicationContext留给程序员使用的ioc容器接口;ApplicationContext是BeanFactory的子接口

3.spring 的特性?谈谈你对 spring 的理解?spring 用来干嘛?

      Spring框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IOC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。

优点:

  1. 低侵入 / 低耦合 (降低组件之间的耦合度,实现软件各层之间的解耦)
  2. 声明式事务管理(基于切面和惯例)
  3. 方便集成其他框架(如MyBatis、Hibernate)
  4. 降低 Java 开发难度
  5. Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)

Spring 能帮我们做什么?

      ①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
      ②.Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
      ③.Spring 能非常简单的帮我们管理数据库事务。
      ④.Spring 还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。
      ⑤.Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
      ⑥.Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。
  

4.jdk 的动态代理和 cglib 动态代理有什么区别?

  1. jdk动态代理: JDK是基于反射机制,生成一个实现代理接口的匿名类,然后重写方法,实现方法的增强。它生成类的速度很快,但是运行时因为是基于反射,调用后续的类操作会很慢。而且他是只能针对接口编程的。只能针对接口不能针对类实现代理。
  2. cglib动态代理:CGLIB是基于继承机制,继承被代理类,所以方法不要声明为final,然后重写父类方法达到增强了类的作用。底层是基于asm第三方框架,是对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。生成类的速度慢,但是后续执行类的操作时候很快,可以针对类和接口。

5.aop 的实现原理?

  1. aop底层采用动态代理机制实现:接口+实现类
  2. 接口:spring采用jdk的动态代理proxy
  3. 实现类:spring采用cglib实现字节码增强
  4. aop的横向机制原理:由代理创建出一个和impl实现类平级的一个对象,但是这个对象不是一个真正的对象,只是一个代理对象,但它可以实现和impl相同的功能。

6.springmvc 的原理?springmvc 的工作流程?

SpringMVC的原理图:
SSM常见面试题_第1张图片

SpringMVC工作流程?
SSM常见面试题_第2张图片

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter处理器适配器。
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  9. ViewResolver解析后返回具体View。
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
  11. DispatcherServlet响应用户
      

7.springmvc 的常用注解有哪些?

  1. 控制反转

     @Component,标注为一个普通的bean
     
     @Service
     
     @Repository
    
  2. 依赖注入

     @Autowired
    
     @Qulifier
    
     @Resource
    
     @Value
    
  3. 全局配置

    @Configuration,代替配置文件,相当于beans
    
    @ComponentScan,配置扫描包
    
    @Scope,配置bean的生命周期
    

8.mybatis 使用了哪些设计模式?你了解过哪些设计模式?

1、建造者模式(Builder Pattern)
      使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。例如SqlSessionFactoryBuilderXMLConfigBuilderXMLMapperBuilder
SSM常见面试题_第3张图片XMLConfigBuilder :XML配置构建器,建造者模式,继承BaseBuilder

2、 简单工厂模式(Simple Factory Pattern)
      又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式,专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。如:
   SqlSessionFactory:创建SqlSession对象。
   ObjectFactory:对象工厂:所有对象都要由工厂来产生 。
   MapperProxyFactory:创建映射器代理 MapperProxy对象。

3、 单例模式(Singleton Pattern)
      三个要点:

  1. 某个类只能有一个实例;
  2. 它必须自行创建这个实例;
  3. 它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。

如:ErrorContextLogFactory
      ErrorContext:用在每个线程范围内的单例,用于记录该线程的执行环境错误信息,
      LogFactory:是提供给整个Mybatis使用的日志工厂,用于获得针对项目配置好的日志对象。

4、代理模式(Proxy Pattern)
      Mybatis核心使用的模式,给某一个对象提供一个代理,并由代理对象控制对原对象的引用。它是一种对象结构型模式。
        如MapperProxy为绑定我们开发的MapperMapper.xml创建代理类、Plugin为每个插件创建一个代理类等。

5、组合模式

      组合多个对象形成树形结构以表示“整体-部分”的结构层次。
      组合模式最关键的地方叶子对象和组合对象实现相同的接口。
例如SqlNode和各个子类ChooseSqlNode等;

6、适配器模式(Adapter Pattern)
      作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
      例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现

7、模板方法模式(Template Pattern)
      是基于继承的代码复用的基本技术。模板方法模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

      例如BaseExecutorSimpleExecutor,还有BaseTypeHandler和所有的子类如IntegerTypeHandler

8、装饰器模式(Decorator Pattern)
      装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

      例如Cache包中的cache.decorators子包中等各个装饰者的实现;

9、迭代器模式(Iterator)
      又叫游标(Cursor)模式。GOF定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

      例如迭代器模式PropertyTokenizer

你可能感兴趣的:(Java学习,设计模式,spring,面试,mybatis,java)