我正在尝试实现编解码器来解密Oracle数据连接的密码。编解码器将在不同的位置使用,我认为为它创建一个插件可能是个好主意。我的想法是创建一个能够识别Spring上下文的编解码器,并且可以从 Config.groovy 中获取它的词组。我编写了Codec编码,它在应用程序启动时连接 - 但是当应用程序启动时,我的SpringContext.getApplicationContext()
似乎返回null。我假设这是因为应用程序上下文尚未初始化 - 但我的研究并没有告诉我有关加载顺序的信息。
如果是这样的话,怎么会在配置中外化这样的东西呢?我知道访问 DataSource 信息的唯一方法是通过grailsApplication
引用(再次依赖Spring)等项目。
稍微清理过的代码段:
static Codec getCodec(){
if( !SpringContext.getApplicationContext() ){
println "Context Is Null"
}
def config = SpringContext?.getApplicationContext()?.
getBean("grailsApplication")?.config?.crypto
String saltValue = config?.salt
...
Datasource.groovy就这样设置了:
datasource {
...some stuff
passwordEncryptionCodec = 'com.someguy.mycode.StaticCodec'
在StaticCodec中,我基本上有编码/解码方法在第一个代码示例中调用工厂方法,它们执行没有问题 - 我在执行run-app后收到启动日志中打印的“Context Is Null”语句
SpringContext 是我在我的插件的doWithSpring
部分创建的一个bean,似乎在这个启动问题之外工作正常(在请求时访问编解码器工作正常)
我认为Spring容器将是应用程序启动时首先运行的东西 - 我错了吗?当数据源在启动时设置时,是否还有其他原因导致应用程序上下文为空?
答案 0 :(得分:2)
我认为Spring容器将是第一件事 应用程序启动时运行 - 我错了吗?
是的,你是。
在初始化Spring容器之前,必须对配置文件进行评估,因为这些配置文件定义了影响Spring容器初始化的元素。