1

私のアプリケーションは Web アプリケーションですが、Spring の Web コントローラーはあまり使用しません。REST (ジャージー) とソケットだけです。私のアプリケーションの約半分だけが依存性注入を使用しています。私のアプリケーションは my 内で初期化されますmain()

ServletRegistration jerseyServletRegistration = ctx.addServlet("JerseyServlet", new SpringServlet());
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.property.packages", "com.production.resource");
jerseyServletRegistration.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters", "com.production.resource.ResponseCorsFilter");
jerseyServletRegistration.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", Boolean.TRUE.toString());
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.feature.DisableWADL", Boolean.TRUE.toString());
jerseyServletRegistration.setInitParameter("org.codehaus.jackson.map.DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY", Boolean.TRUE.toString());
jerseyServletRegistration.setLoadOnStartup(1);

jerseyServletRegistration.addMapping("/api/*");

//add atmosphere support
ServletRegistration socketRegistration = ctx.addServlet("AtmosphereServlet", new SocketInitializer());
socketRegistration.setLoadOnStartup(1);
//socketRegistration.addMapping("/socket/*");

//deploy
logger.info("Deploying server...");
ctx.deploy(server);

server.start();

//start the production process
Production.init();

System.in.read();
server.stop();

クラス内で、Productionを介してサービスをロードしますApplicationContextProvider依存性注入を介してすべてのリソースをロードできるようにする、これを行うためのより良い方法はありますか?

public static void init() {
    //add hook to trigger Production Shutdown sequence
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            Production.shutdown();
        }
    }));

    logger.info("Initializing production workflows...");
    productionService = (ProductionService) ApplicationContextProvider.getApplicationContext().getBean("productionService");

    //load active workflows into memory
    WorkflowService workflowService = (WorkflowService) ApplicationContextProvider.getApplicationContext().getBean("workflowService");
    for (WorkflowEntity workflowEntity : workflowService.findActive()) {
        logger.info("      - "+workflowEntity.getName()+"");
        workflowList.add(Workflow.factory(workflowEntity));
    }

    bootup();

    logger.info("Production initialized");
}
4

1 に答える 1

3

静的コンテキストのため、それを行う方法はないと思います。

init()メソッドを非静的な方法で使用できる場合は、SpringBeanAutowiringSupportヘルパー クラスを使用して実行できます。

@Autowired
private ProductionService productionService;

// ... another dependencies

public void init() throws ServletException {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    // use autowired services
}

SpringBeanAutowiringSupport別のオプションがあります。クラスの基本クラスとして使用できますProduction。この場合、手動で呼び出す必要はありませんSpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);。依存関係を追加するだけです。

于 2013-07-16T12:19:06.737 に答える