Spring、MyBatis 面试题

之前以为面经只是死记硬背的东西,后来发现记住了它们,对自己对知识的理解确实有帮助,难怪语文的文章老是要求背背背。

前言

这次的面经整理分为以下几个部分,希望对大家的工作有帮助。

内容 链接地址
Java 基础 传送门
Java 集合 传送门
Java 多线程 传送门
Java虚拟机 传送门
计算机网络 传送门
数据结构和算法 传送门
数据库 传送门
JavaWeb 传送门
设计模式 传送门
Spring、MyBatis 传送门

1 Spring

1.1 控制反转思想

介绍一下 Spring 的 IoC

控制反转指的是在程序中,原本需要我们手动创建的对象现在可以由 Spring 的 IoC 容器帮助创建和注入依赖对象,我们只需要告诉容器什么时候创建对象、创建什么对象,完全不用考虑对象是怎么创建出来的。

2 传统程序设计与 IoC 模式的区别

传统程序设计流程如下图所示,是主动去创建相关对象然后再组合起来:

请添加图片描述
当有了 IoC 的容器后,在客户端类中不再主动去创建这些对象了,而是告诉 IoC 容器我们想要什么,如下图所示:
请添加图片描述

3 介绍一下 Spring IoC 容器的初始化过程

这个过程包括 BeanDefinition 的资源定位、载入和注册三个基本过程。具体分别如下:

  • 第一个过程是 Bean 的资源定位。这个定位过程类似于容器寻找数据的过程,就像用水桶装水先要把水找到一样;
  • 第二个过程是 BeanDefinition 的载入。这个载入过程是将用户定义好的 Bean 表示成 IoC 容器内部的数据结构,而这个容器内部的数据结构就是 BeanDefinition;
  • 第三个过程是向 IoC 容器注册这些 BeanDefinition。这个注册过程就是将在 IoC 容器内部将 BeanDefinition 注入到一个 HashMap 中去的过程。

参考文献:传送门

4 介绍一下依赖注入(DI)

依赖注入是控制反转的一种实现方式,指的是程序所依赖的组件在运行时会动态地加载到程序中。

依赖注入的案例:

汽车是一个复杂对象,其中包含许多的组件,如发动机、轮子等。当我们想要创建两辆不同的汽车时,有两种方案:

  1. 在 car 类中实例化一个 wheel 对象,然后实例化这个 car 对象;
  2. 在外部创建 wheel 对象,然后将其传入到 car 类中。

5 依赖注入的方式有哪些

  1. 构造器注入;
  2. Setter 方法注入;
  3. 属性(p)命名空间或者构造器(c)命名空间注入。

1.2 面向切面编程(AOP)

1 介绍一下 AOP

面向切面编程是面向对象编程的补充,它将面向对象编程产生的各个业务模块所共同调用的部分封装起来,达到与主业务逻辑解耦的目的。

同时,AOP 可以在不改变原来的代码的情况下,实现对原有功能的增强。(代理模式,开闭原则)

2 介绍一下 Spring AOP 中创建代理的方式

Spring AOP 就是基于动态代理的,Spring 中的 AOP 目前支持 JDK 动态代理和 Cglib 代理。

如果要代理的对象,实现了某个接⼝,那么 Spring AOP 会使⽤ JDK Proxy,去创建代理对象,⽽对于没有实现接⼝的对象,就⽆法使⽤ JDK Proxy 去进⾏代理了,这时候Spring AOP 会使⽤ Cglib ,这时候 Spring AOP 会使⽤ Cglib ⽣成⼀个被代理对象的⼦类来作为代理。

3 说一下 JDK 动态代理和 Cglib 代理的区别

  1. JDK 动态代理本质上是实现了被代理对象的接口,而 Cglib 本质上是继承了被代理对象,覆盖其中的方法;
  2. JDK 动态代理只能对实现了接口的类生成代理,Cglib 则没有这个限制。但是 Cglib 因为使用继承实现,所以 Cglib 无法代理被 final 修饰的方法或类;
  3. 在调用代理方法上,JDK 动态代理是通过反射机制调用,Cglib 是通过 FastClass 机制直接调用。FastClass 简单的理解,就是使用 index 作为入参,可以直接定位到要调用的方法直接进行调用;
  4. 在性能上,JDK1.7 之前,由于使用了 FastClass 机制,Cglib 在执行效率上比 JDK 快,但是随着 JDK 动态代理的不断优化,从 JDK 1.7 开始,JDK 动态代理已经明显比 Cglib 更快了。

JDK 动态代理只能对实现了接口的类生成代理的根本原因是通过 JDK 动态代理生成的类已经继承了 Proxy 类,所以无法再使用继承的方式去对类实现代理

4 说一下 Spring AOP 和 AspectJ AOP 的区别

  1. Spring AOP 属于运行时增强,而 AspectJ 是编译时增强;
  2. Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation);
  3. Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单;
  4. 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。

1.3 Spring bean

1 什么是 Spring bean 容器

Spring 官方文档对 bean 的解释是:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

翻译过来就是:

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是一个由 Spring IoC 容器实例化、组装和管理的对象。

概念简单明了,我们提取处关键的信息:

  1. bean 是对象,一个或者多个不限定;
  2. bean 由 Spring 中一个叫 IoC 的东西管理;
  3. 我们的应用程序由一个个 bean 构成。

2 将⼀个类声明为 Spring 的 bean 的注解有哪些

我们⼀般使⽤ @Autowired 注解⾃动装配 bean,要想把类标识成可⽤于 @Autowired 注解⾃动装配的 bean 的类,采⽤以下注解可实现:

  • @Component :通⽤的注解,可标注任意类为 Spring 组件,如果⼀个Bean不知道属于哪个层,可以使⽤ @Component 注解标注;
  • @Repository : 对应持久层即 Dao 层,主要⽤于数据库相关操作;
  • @Service : 对应服务层,主要涉及⼀些复杂的逻辑;
  • @Controller : 对应 Spring MVC 控制层,主要⽤户接受⽤户请求并调⽤ Service 层返回数据给前端⻚⾯。

参考文献:传送门

3 将⼀个类声明为 Spring 的 bean 的代码实现

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值