Open rooobot opened 4 years ago
问题:请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
答:
最常见的应该是dao的设计了,相对于具体的数据库而言,dao层属于更高层,所以dao的设计不应该依赖于具体的数据库实现,如MySQL、h2等。
dao
MySQL
h2
通常dao会设计为一组接口,每个接口里有一组与某个类的存储相关的方法声明,在系统上线时,业务代码调用dao层读写数据时,假设是使用MySQL数据库,那么,程序在加载时,会从classpath中读取MySQL数据库的驱动,并建立MySQL数据库的连接池,这样业务代码在调用dao的接口时,持久层框架就会执行对应配置好的数据库的SQL操作语句,这样就能正确的读写数据库了。
classpath
SQL
同时,为了支持单元测试,我们在测试时,一般使用h2之类的内存数据库,所以在测试环境的profile下,我们只需要在classpath加载h2数据库的驱动,在测试代码启动时,会加载h2数据为库的驱动(具体的实现是JDBC的SPI机制),然后在执行测试用例时,就能正确的在h2中读写数据了。
profile
JDBC
SPI
这里的两个场景:测试用例场景和线上业务代码场景,使用的是不同的数据库(MySQL和h2),而我们的代码只有dao的接口,持久层框架(如MyBatis)框架的会通过JDBC的SPI机制加载数据库的驱动,然后执行对应配置好的数据库的SQL操作语句,从而正确的在不同场景下实现对不同数据库的读写操作。
MyBatis
问题:请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
答:
最常见的应该是
dao
的设计了,相对于具体的数据库而言,dao
层属于更高层,所以dao
的设计不应该依赖于具体的数据库实现,如MySQL
、h2
等。通常
dao
会设计为一组接口,每个接口里有一组与某个类的存储相关的方法声明,在系统上线时,业务代码调用dao
层读写数据时,假设是使用MySQL
数据库,那么,程序在加载时,会从classpath
中读取MySQL
数据库的驱动,并建立MySQL
数据库的连接池,这样业务代码在调用dao
的接口时,持久层框架就会执行对应配置好的数据库的SQL
操作语句,这样就能正确的读写数据库了。同时,为了支持单元测试,我们在测试时,一般使用
h2
之类的内存数据库,所以在测试环境的profile
下,我们只需要在classpath
加载h2
数据库的驱动,在测试代码启动时,会加载h2
数据为库的驱动(具体的实现是JDBC
的SPI
机制),然后在执行测试用例时,就能正确的在h2
中读写数据了。这里的两个场景:测试用例场景和线上业务代码场景,使用的是不同的数据库(
MySQL
和h2
),而我们的代码只有dao
的接口,持久层框架(如MyBatis
)框架的会通过JDBC
的SPI
机制加载数据库的驱动,然后执行对应配置好的数据库的SQL
操作语句,从而正确的在不同场景下实现对不同数据库的读写操作。