4

我有一个带有 Wicket 的 Spring 项目。我可以使用@SpringBean 注解成功地在 Wicket 组件中注入服务。

现在,我想访问 Spring Application Context。所以我声明了一个ApplicationContext类型的成员变量并用@SpringBean注解它,就像其他服务一样:

尝试使用@SpringBean 注入应用程序

public class MyPanel extends Panel {

    @SpringBean
    private ApplicationContext applicationContext;

    ...
}

但是,在运行时,这会给出错误

bean of type [org.springframework.context.ApplicationContext] not found

不能将 ApplicationContext 注入到 Wicket 组件中吗?如果是这样,什么是访问 ApplicationContext 的合适方法?

4

2 回答 2

6

ApplicationContext 应该可以在您的应用程序类中访问。

ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);

在您的应用程序类中创建一个 getApplicationContext 方法。

public class MyApplication extends WebApplication {

    public ApplicationContext getAppCtx() {
        return WebApplicationContextUtils.getWebApplicationContext(servletContext);
    }

}

可以从任何检票口组件访问应用程序对象。

public class MyPanel extends Panel {

    public MyPanel(String id) {
        ...
        ApplicationContext appCtx = ((MyApplication) getApplication()).getAppCtx();
        ...
    } 
}   
于 2012-03-22T13:41:20.297 回答
3

ApplicationContext 不能作为 bean 注入,因为它实际上不是 bean。

Spring 提供了ApplicationContextAware接口,为您的应用程序提供了一种获取 Spring 上下文的简单方法:

public class MyContentProvider extends Panel implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext ctx) {
         applicationContext=ctx;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

Spring 引擎在实例化 bean 时将检测接口并访问 setter。

在您的检票口组件中,注入此提供程序:

public class MyPanel extends Panel {

    @SpringBean
    private MyContentProvider contextProvider;

    ...
}

并使用它:

contextProvider.getApplicationContext().getBean("foo");
于 2012-03-22T13:48:20.927 回答