iBATIS 3 und Spring 2 - Resourcen
2009-12-17 Gespeichert in: Softwareentwicklung
Das Spring Framework 2.x enthält Unterstützung zur Verwendung von iBATIS, leider aber nur für Version 2. Mit ein wenig eigenem Code kann das kurz vor dem Release stehende iBATIS 3 aber auch einfach eingebunden werden.
Die DataSource wird jetzt über Spring injected. Ein Problem bleibt aber noch. Je nach Angabe der Resource in Spring, findet iBATIS die Konfiguration, insbesondere ausgelagerte Mapper, nicht unbedingt. Typisches Beispiel ist eine Webapp, die als WAR deployed wird. In diesem Falle hilft ein kleiner Helper:
Der
Wenn jetzt in der Spring-Konfiguration noch sichergestellt wird, dass der
Die DataSource wird jetzt über Spring injected. Ein Problem bleibt aber noch. Je nach Angabe der Resource in Spring, findet iBATIS die Konfiguration, insbesondere ausgelagerte Mapper, nicht unbedingt. Typisches Beispiel ist eine Webapp, die als WAR deployed wird. In diesem Falle hilft ein kleiner Helper:
public class IbatisSpringResourceHelper
implements ResourceLoaderAware, InitializingBean, DisposableBean
{
private ResourceLoader resourceLoader;
private ClassLoader originalClassLoader;
private Charset resourceCharset;
public void setResourceLoader(ResourceLoader resourceLoader)
{
this.resourceLoader = resourceLoader;
}
public void afterPropertiesSet()
{
originalClassLoader = Resources.getDefaultClassLoader();
Resources.setDefaultClassLoader(new ResourceClassLoader());
if (resourceCharset != null) {
Resources.setCharset(resourceCharset);
}
}
public void destroy()
{
Resources.setDefaultClassLoader(originalClassLoader);
}
// inner class ResourceClassLoader
}
Der
ResourceClassLoader ist ein spezieller ClassLoader, der den ursprünglichen von iBATIS als Parent hat und die Methoden getResource*(String name) so überschreibt, dass wenn möglich der Spring resourceLoader benutzt wird:private class ResourceClassLoader
extends ClassLoader
{
public ResourceClassLoader()
{
super(originalClassLoader);
}
@Override
public URL getResource(String name)
{
Resource resource = resourceLoader.getResource(name);
if (resource.exists()) {
try {
return resource.getURL();
} catch (IOException e) {
return super.getResource(name);
}
}
return super.getResource(name);
}
@Override
public InputStream getResourceAsStream(String name)
{
Resource resource = resourceLoader.getResource(name);
if (resource.exists()) {
try {
return resource.getInputStream();
} catch (IOException e) {
return super.getResourceAsStream(name);
}
}
return super.getResourceAsStream(name);
}
@Override
public EnumerationgetResources(String name)
throws IOException
{
Resource resource = resourceLoader.getResource(name);
if (resource.exists()) {
try {
return Collections.enumeration(Collections.singleton(resource.getURL()));
} catch (IOException e) {
return super.getResources(name);
}
}
return super.getResources(name);
}
}
Wenn jetzt in der Spring-Konfiguration noch sichergestellt wird, dass der
IbatisSpringResourceHelper vor dem SqlSessionFactoryBean geladen wird, funktionierts. Dazu kann das Attribut depends-on in der Bean-Definition der SqlSessionFactoryBean genutzt werden.
