En Java, diverses ressources peuvent être chargées à l'aide d'une API similaire mais avec des protocoles d'URL différents. Cela permet de découpler le processus de chargement des ressources de l'application et simplifie la configuration des ressources.
Pouvez-vous utiliser un protocole pour obtenir des ressources à l'aide du chargeur de classe actuel, similaire au protocole Jar mais sans spécifier le fichier d'origine ou dossier ?
Cela peut être réalisé en implémentant un URLStreamHandler personnalisé et en l'enregistrant auprès du JVM.
import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandler extends URLStreamHandler { private final ClassLoader classLoader; public ClasspathHandler(ClassLoader classLoader) { this.classLoader = classLoader; } @Override protected URLConnection openConnection(URL u) throws IOException { // Locate the resource using the classloader URL resourceUrl = classLoader.getResource(u.getPath()); // Open the connection to the resource return resourceUrl.openConnection(); } }
Utilisation : Le gestionnaire personnalisé peut être utilisé avec une URL pour charger des ressources à partir de le chemin de classe :
new URL("classpath:org/my/package/resource.extension").openConnection();
Pour rendre le gestionnaire accessible globalement, enregistrez-le auprès de la JVM à l'aide d'un URLStreamHandlerFactory :
import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandlerFactory implements URLStreamHandlerFactory { private final Map<String, URLStreamHandler> protocolHandlers; public ClasspathHandlerFactory() { protocolHandlers = new HashMap<String, URLStreamHandler>(); addHandler("classpath", new ClasspathHandler(ClassLoader.getSystemClassLoader())); } public void addHandler(String protocol, URLStreamHandler handler) { protocolHandlers.put(protocol, handler); } public URLStreamHandler createURLStreamHandler(String protocol) { return protocolHandlers.get(protocol); } }
Appelez URL.setURLStreamHandlerFactory() avec la fabrique configurée pour vous inscrire it.
L'implémentation fournie est publiée dans le domaine public. L'auteur encourage le partage et la publication des modifications.
Bien que cette approche offre de la flexibilité, il est important de prendre en compte les problèmes potentiels, tels que la possibilité d'enregistrements multiples de JVM Handler Factory et Utilisation par Tomcat d'un gestionnaire JNDI. Par conséquent, il est recommandé de tester dans l’environnement souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!