Die JDBC API ist ein hervorragendes Beispiel dafür. So können Sie den JDBC-Treiber konfigurieren kann extern in zum Beispiel eine Eigenschaftendatei:
driver = com.dbvendor.jdbc.Driver
url = jdbc:dbvendor://localhost/dbname
username = stackoverflow
password = youneverguess
..welche können Sie verwenden, wie:
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);
Jede JDBC-Treiber Implementierung registriert sich im Grunde in der DriverManager
im Inneren ein static
Initialisierungsblock. Es ist nämlich derjenige, der während Class#forName()
ausgeführt wird.
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");
}
}
Da die DriverManager
grob sieht wie folgt aus (es tatsächlich die altmodische Vector
verwendet)
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");
}
... Sie können eine Verbindung, um sie ohne die Notwendigkeit erhalten die Fahrer selbst zu instanziiert !
Auf diese Weise ist der JDBC-Code sehr portabel. Sie können die DB ändern oder den Code unter Benutzern mit unterschiedlichen DBs verteilen, ohne den Code selbst ändern/hacken/neu erstellen zu müssen.
Nicht nur JDBC verwendet diesen Ansatz, sondern auch andere APIs wie Servlet API, ORMs wie Hibernate/JPA, Dependency-Injection-Frameworks usw. Reflektion zum Laden der Klassen basierend auf extern konfigurierbaren Eigenschaftsdateien, XML-Konfigurationsdateien und/oder Anmerkungen. Alles macht den Code viel portabler und steckbarer.
Hibernate und AspectJ sind Beispiele für das Erstellen von Klassen im laufenden Betrieb. –