如何将现有对象传递给Spring WebApplicationContext?

时间:2017-01-23 09:12:49

标签: java spring spring-mvc

我想从桌面应用程序启动嵌入式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.

2 个答案:

答案 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参数)的方法。