麦当劳(二面)
你项目用了Spring Boot,那你对IoC和DI有了解吗?
IOC 是一种设计原则,它将对象的创建和依赖关系的管理从传统的代码中转移到外部容器中。在传统的编程方式中,对象的创建和依赖关系的维护是由程序自身负责的,即对象会主动创建它所依赖的其他对象。而在 IOC 模式下,对象的创建和依赖关系的管理由一个外部容器负责,对象只需要被动地接受容器注入的依赖对象,控制权发生了反转。
假设我们有一个 UserService
类,它依赖于 UserDao
类。在传统编程方式中,UserService
类需要自己创建 UserDao
对象:
public class UserService {
private UserDao userDao;
public UserService() {
this.userDao = new UserDao();
}
// 其他方法
}
而在 IOC 模式下,UserService
类不再自己创建 UserDao
对象,而是由外部容器负责创建和注入:
public class UserService {
private UserDao userDao;
// 通过构造函数注入依赖
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// 其他方法
}
DI 是 IOC 的一种具体实现方式,它通过某种方式将依赖对象注入到目标对象中。依赖注入可以通过构造函数、Setter 方法、接口注入等方式实现。
-
构造函数注入:通过构造函数将依赖对象传递给目标对象。
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// 其他方法
}
-
Setter 方法注入:通过 Setter 方法将依赖对象注入到目标对象中。
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
// 其他方法
}
-
接口注入:目标对象实现一个特定的接口,通过接口方法注入依赖对象。不过这种方式在实际开发中使用较少。
项目中使用的ORM框架是什么?
用的是 mybatis 框架,与传统的jdbc 的对比,优势主要有:
-
基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。
-
与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不 需要手动开关连接;
-
很好的与各种数据库兼容,因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持。
-
能够与 Spring 很好的集成,开发效率高
-
提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射 标签,支持对象关系组件维护。
熟悉JVM吗?有了解过垃圾回收算法吗?
-
标记-清除算法:标记-清除算法分为“标记”和“清除”两个阶段,首先通过可达性分析,标记出所有需要回收的对象,然后统一回收所有被标记的对象。标记-清除算法有两个缺陷,一个是效率问题,标记和清除的过程效率都不高,另外一个就是,清除结束后会造成大量的碎片空间。有可能会造成在申请大块内存的时候因为没有足够的连续空间导致再次 GC。
-
复制算法:为了解决碎片空间的问题,出现了“复制算法”。复制算法的原理是,将内存分成两块,每次申请内存时都使用其中的一块,当内存不够时,将这一块内存中所有存活的复制到另一块