有没有人知道如何操作spring应用程序上下文来使用指定的资源解析器。我编写了一个s3资源来从amazon s3中提取安全上下文中的内容,以及一个资源解析器从s3:// ... type urls创建这些“资源”,本地应用程序上下文在加载时使用正确的安全凭据从配置的amazons3client。我编写了一个s3 ResourceLoader,用于为新构建的s3资源预配置AmazonS3客户端。
能够在上下文配置中将这些资源简单地指定为“s3:// ...”并依靠此资源解析器来创建正确的资源类型会很高兴,但到目前为止,这需要覆盖spring ApplicationContext的getResource方法继承自DefaultResourceLoader以使用我自己的resourceResolver实现。
另一个方法是为匹配“s3:// ...”方案的资源配置变量解析器,以解析资源解析器的资源类型。
我希望他们是一个春天大师,他们知道一个更好的方法来操纵spring应用程序上下文的基础结构(ClasspathXMLAC为了参数),以使我的S3安全需求非常容易处理。
欢迎提出其他建议。
答案 0 :(得分:1)
使用Spring的GenericApplicationContext的实现,它提供了#setResourceLoader方法。
你提到了ClassPathXmlApplicationContext,它不是GenericApplicationContext,这意味着你被迫采取丑陋的覆盖路线。
GenericXmlApplicationContext是CPXAC的首选替代品,顾名思义,它是GenericApplicationContext。
所以你应该能够做到以下几点:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.setResourceLoader(new S3ResourceLoader());
ctx.load("s3:///some.bucket.name/path/to/my/spring.xml");
ctx.refresh();
...
显然,S3ResourceLoader需要使用键等进行参数化。注意,S3ResourceLoader应该扩展DefaultResourceLoader,以便获取那里可用的所有其他功能,例如:处理“classpath:”和其他资源前缀。
上面示例中的调用顺序很重要,即在使用s3:resource前缀调用#load之前需要提供资源加载器,原因很明显。