我想从桌面应用程序启动嵌入式Tomcat服务器。在Tomcat容器内运行的webapp是通过Spring的WebApplicationInitializer配置的(现在我只是扩展了AbstractAnnotationConfigDispatcherServletInitializer)。如何将现有对象从桌面应用程序传递到webapp使用的WebApplicationContext?
以下是一些示例代码,希望能够更清楚地说明我要实现的目标:
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { SpringAppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { SpringWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
@Configuration
@EnableWebMvc
public class SpringWebConfig extends WebMvcConfigurerAdapter {
}
//somewhere in my desktop application where I want to start the server...
MyObject myObj = new MyObject(SomeParameters params);
//I want to have myObj available for Spring managed objects,
//like @Components and @RestController etc. that get created by Spring
Tomcat tc = new Tomcat();
//some tomcat configuration here
tc.start(); //automatically searches for WebApplicationInitializer in classpath
//I do not know how the Spring managed beans can be made aware of myObj.
答案 0 :(得分:1)
Spring容器可以管理Spring容器初始化的所有对象。如果你想在运行时在spring中注入任何外部对象,你就无法做到。
因此,外部编码创建的任何对象都无法在春季进行管理或注入。
希望这可以解除你的怀疑。
答案 1 :(得分:0)
使用Jetty作为我的嵌入式容器我能够使用ServletContext
属性执行此操作。通过在创建WebAppContext
时传入属性,我可以通过让他们实现ServletContextAware
来访问我的bean。
所以我创建了我的Jetty实例,并使用WebAppContext
:
WebAppContext webapp = new WebAppContext();
webapp.setAttribute("org.apache.geode.securityService", getSecurityService());
然后我的bean只是实现了ServletContextAware
:
public class LoginHandlerInterceptor implements ServletContextAware {
...
@Override
public void setServletContext(ServletContext servletContext) {
securityService = (SecurityService) servletContext.getAttribute("org.apache.geode.securityService");
}
}
我确信必须有一种在Tomcat中设置servlet上下文属性(而不是servlet init参数)的方法。