非Web Spring Context中的ApplicationContextInitializer?

Posted

技术标签:

【中文标题】非Web Spring Context中的ApplicationContextInitializer?【英文标题】:ApplicationContextInitializer in a non-web Spring Context? 【发布时间】:2012-11-08 12:10:10 【问题描述】:

我创建了一个 ApplicationContextInitializer 实现来从客户源 (ZooKeeper) 加载属性并将它们添加到 ApplicationContext 的属性源列表中。

我能找到的所有文档都与 Spring web-apps 相关,但我想在一个独立的消息消费应用程序中使用它。

实例化我的实现、创建上下文然后“手动”将上下文传递给我的实现的正确方法吗?或者我是否缺少框架的一些自动功能,将我的初始化程序应用于我的上下文?

【问题讨论】:

【参考方案1】:

我发现通过使用空白上下文进行初始化来实现 SpringMVC 的初始化上下文策略非常简单。在正常的应用程序上下文中,没有任何东西使用 ApplicationContextInitializer,因此您必须自己执行它。

没问题,尽管在普通 J2SE 应用程序中,如果您拥有上下文加载器块的所有权,那么您将可以访问生命周期的每个阶段。

// Create context, but dont initialize with configuration by calling 
// the empty constructor. Instead, initialize it with the Context Initializer.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
MyAppContextInitializer initializer = new MyAppContextInitializer();
initializer.initialize( ctx );

// Now register with your standard context
ctx.register( com.my.classpath.***Configuration.class );
ctx.refresh()

// Get Beans as normal (e.g. Spring Batch)
JobLauncher launcher = context.getBean(JobLauncher.class);

我希望这会有所帮助!

【讨论】:

【参考方案2】:

如果我对问题的理解正确,您可以在 Spring 文档中找到解决方案第 4 节。IoC 容器

这里有一个关于如何启动您的应用程序的示例 - 4.2.2 Instantiating a container

也可以看看5.7 Application contexts and Resource paths

【讨论】:

【参考方案3】:

不确定其他版本,但在 Spring 4:

AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(yourConfig.class);

【讨论】:

以上是关于非Web Spring Context中的ApplicationContextInitializer?的主要内容,如果未能解决你的问题,请参考以下文章

关于spring boot如何正确禁用web环境

spring 的配置文件 是上个web.xml 加载spring容器中的/WEB-INF/application.xml 文件

SpringBoot启动及自动装配原理

java.lang.ClassNotFoundException:eclipse中的org.springframework.web.context.ContextLoaderListener

Spring加载context的几种方法

interface21 - web - ContextLoaderListener(Spring Web Application Context加载流程)