Java 使用@SpringBean将ApplicationContext注入Wicket组件失败

Java 使用@SpringBean将ApplicationContext注入Wicket组件失败,java,spring,wicket,applicationcontext,Java,Spring,Wicket,Applicationcontext,我和Wicket有一个春季项目。我可以使用@SpringBean注释成功地在Wicket组件中注入服务 现在,我想访问Spring应用程序上下文。因此,我声明了一个类型为ApplicationContext的成员变量,并用@SpringBean对其进行了注释,就像其他服务一样: 尝试使用@SpringBean注入应用程序 public class MyPanel extends Panel { @SpringBean private ApplicationContext app

我和Wicket有一个春季项目。我可以使用@SpringBean注释成功地在Wicket组件中注入服务

现在,我想访问Spring应用程序上下文。因此,我声明了一个类型为ApplicationContext的成员变量,并用@SpringBean对其进行了注释,就像其他服务一样:

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

public class MyPanel extends Panel {

    @SpringBean
    private ApplicationContext applicationContext;

    ...
}
但是,在运行时,这会产生错误

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

无法将ApplicationContext注入Wicket组件吗?如果是这样,那么什么是访问ApplicationContext的合适方式?

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();
        ...
    } 
}   

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

Spring提供了一个接口,为您的应用程序提供了访问Spring上下文的简单方法:

public class MyContentProvider extends Panel implements ApplicationContextAware {

    private ApplicationContext applicationContext;

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

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}
在实例化bean时,Spring引擎将检测接口并访问setter

在wicket组件上,注入此提供程序:

public class MyPanel extends Panel {

    @SpringBean
    private MyContentProvider contextProvider;

    ...
}
并使用它:

contextProvider.getApplicationContext().getBean("foo");

为什么不直接在MyPanel组件中实现ApplicationContextAware接口?将降低复杂性水平;)顺便说一句-好答案!直到今天我才知道这个接口的存在。@magomi-True,它会降低复杂性,但我不知道wicket框架,也不知道它的组件是通过Spring引擎初始化的,还是使用自己的引擎(这可能会使它无法工作)。这个解决方案很复杂,但我很确定它会起作用:)