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

时间:2012-03-22 13:26:49

标签: java spring wicket applicationcontext

我有一个带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的合适方式是什么?

2 个答案:

答案 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");