我有一个带Wicket的Spring项目。我可以使用@SpringBean注释在Wicket组件中成功注入服务。
现在,我想访问Spring Application Context。所以我已经声明了一个ApplicationContext类型的成员变量,并用@SpringBean注释它,就像其他服务一样:
尝试使用@SpringBean注入Application
public class MyPanel extends Panel {
@SpringBean
private ApplicationContext applicationContext;
...
}
但是,在运行时,这会产生错误
bean of type [org.springframework.context.ApplicationContext] not found
是否无法将ApplicationContext注入Wicket组件?如果是这样,那么访问ApplicationContext的合适方式是什么?
答案 0 :(得分:6)
ApplicationContext应该可以在您的应用程序类中访问。
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
在应用程序类中创建getApplicationContext方法。
public class MyApplication extends WebApplication {
public ApplicationContext getAppCtx() {
return WebApplicationContextUtils.getWebApplicationContext(servletContext);
}
}
可以从任何wicket组件访问应用程序对象。
public class MyPanel extends Panel {
public MyPanel(String id) {
...
ApplicationContext appCtx = ((MyApplication) getApplication()).getAppCtx();
...
}
}
答案 1 :(得分: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。
在您的wicket组件中,注入此提供程序:
public class MyPanel extends Panel {
@SpringBean
private MyContentProvider contextProvider;
...
}
并使用它:
contextProvider.getApplicationContext().getBean("foo");