这就是我想要做的事情,我想知道是否有任何Spring类可以帮助实现。我没有必要使用spring来解决这个问题,我只是用其他一切来实现它。
在我的DAO层中,我希望外部化我的sql文件,即每个文件1个sql。我想读取并缓存sql语句,甚至可能作为一个spring bean单例。但是在我最初的挣扎中,我只是在类路径中加载一个sql文件时遇到了问题......
春天有什么可以帮助的吗?我一直在阅读文档,但没有任何内容正在向我发出。
这是我正在追求的东西..但是我无法识别文件或类似路径...不确定是否需要在applicationContext中定义某些内容?
以下是一些似乎不起作用的尝试......既有弹性又有java'ish。
reader = new BufferedReader(new InputStreamReader(new ClassPathResource("com.company.app.dao.sql.SqlQueryFile.sql").getInputStream())
reader = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("com.company.app.dao.sql.SqlQueryFile.sql")));
有什么想法吗?
答案 0 :(得分:39)
改变。到/作为路径分隔符并使用getResourceAsStream
:
reader = new BufferedReader(new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"com/company/app/dao/sql/SqlQueryFile.sql")));
或
reader = new BufferedReader(new InputStreamReader(
getClass().getResourceAsStream(
"/com/company/app/dao/sql/SqlQueryFile.sql")));
请注意使用Class.getResourceAsStream()
vs ClassLoader.getResourceAsStream
时的前导斜杠。
getSystemResourceAsStream
使用的系统类加载器不是您想要的。
我怀疑使用斜杠而不是点也适用于ClassPathResource
。
答案 1 :(得分:34)
尝试让Spring注入它,假设你使用Spring作为依赖注入框架。
在你的课堂上,做一些这样的事情:
public void setSqlResource(Resource sqlResource) {
this.sqlResource = sqlResource;
}
然后在您的应用程序上下文文件中,在bean定义中,只需设置一个属性:
<bean id="someBean" class="...">
<property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" />
</bean>
Spring应该足够聪明,可以从类路径加载文件并将其作为资源提供给bean。
您还可以查看PropertyPlaceholderConfigurer,并将所有SQL存储在属性文件中,并在需要时单独注入每个SQL。有很多选择。