JDBC API является отличным примером для этого.Таким образом, вы можете настроить драйвер JDBC внешне, например, в файле свойств:
driver = com.dbvendor.jdbc.Driver
url = jdbc:dbvendor://localhost/dbname
username = stackoverflow
password = youneverguess
.., который вы можете использовать как:
Properties properties = new Properties();
properties.load(Thread.currentThread().getResourceAsStream("jdbc.properties"));
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
Каждая реализация драйвера JDBC в основном регистрируется вDriverManager
внутри блока инициализатора static
.Это именно тот, который выполняется во время Class#forName()
.
package com.dbvendor.jdbc;
public class Driver implements java.sql.Driver {
static {
java.sql.DriverManager.registerDriver(new Driver());
}
private Driver() {
// ...
}
public boolean acceptsURL(String url) {
return url.startsWith("jdbc:dbvendor");
}
}
Поскольку DriverManager
примерно выглядит так (на самом деле используется старомодный Vector
)
private static final Set<Driver> drivers = new HashSet<Driver>();
public static void registerDriver(Driver driver) {
drivers.add(driver);
}
public static Connection getConnection(String url, String username, String password) throws SQLException {
for (Driver driver : drivers) {
if (driver.acceptsURL(url)) {
return driver.connect(url, username, password);
}
}
throw new SQLException("No suitable driver");
}
... вы можете получить от него соединение без необходимости создания экземпляра самого драйвера!
Таким образом, код JDBC очень переносим.Вы можете изменить БД или распределить код среди пользователей с различными БД без необходимости изменять / взламывать / перестраивать сам код.
Этот подход использует не только JDBC, но и другие API, такие как Servlet API,ORM, такие как Hibernate / JPA, структуры внедрения зависимостей, и так далее, используют отражение для загрузки классов на основе внешне настраиваемых файлов свойств, файлов конфигурации XML и / или аннотаций.Все это делает код намного более переносимым и подключаемым.