【问题标题】:How can I bind a spring-injected dependency to a wicket page?如何将注入弹簧的依赖项绑定到检票口页面?
【发布时间】:2011-05-10 14:52:46
【问题描述】:

如何将特定依赖项绑定到页面,并为该页面上的组件注入它?

我已经在我的 wicket 应用程序中设置了一个环境,使用(非常小的)wicket-ioc 和 wicket-spring 库,我可以在其中调用 InjectorHolder.getInjector().inject(component),以便注入组件有依赖关系。我所有的检票口组件都是由 Spring 通过 IComponentInstantiationListener 注入的,这部分工作(我将它用于休眠访问)。

我有一个可序列化的对象 (ComponentGraph),我想将其存储为页面上的一个字段。如何让 Spring 确定组件位于哪个页面,并在声明带有 @SpringBean 的 ComponentGraph 字段时为该页面注入正确的 ComponentGraph?

如果有人能指出我正确的方向,我将不胜感激。我对 Wicket 有扎实的了解,但在这一点上,Spring 对我来说仍然是一个充满陌生概念的迷宫。 =)

【问题讨论】:

    标签: java spring dependency-injection wicket


    【解决方案1】:

    这听起来不像是 Spring 的工作。

    但是,我不知道你的 ComponentGraph 的范围,所以我不得不做一些猜测。

    a) 如果每个用户有一个,请将其存储在 custom session object 中。

    b) 如果每个页面都有一个实例,请创建一个基页面类,所有此类页面都从该类继承。让它有一个带有 getter 和 setter 的 componentGraph 字段。

    c) 如果每个页面有一个类,则在帮助 bean 中保留一个类型为 <Class, ComponentGraph> 的映射(可通过类似 helper.getComponentGraphForPageType(this.getClass()) 的方式访问。这可以(并且应该)通过 Spring 注入

    【讨论】:

    • 每页实例。我认为 Spring IOC 的工作是定义一个“上下文”或范围(例如会话、请求或页面范围),并且可以按需抓取该上下文中的服务(所以,也许,我没有要知道页面是什么类,甚至可以将其作为页面上的一个字段来获得组件图)?
    • 这就是 Spring MVC 的工作,Spring Web 框架。 Wicket 定义了它自己的(更简单的)机制。您可以可能让 Spring 使用 wicket 激活请求范围,但这并没有多大意义。如果您想要请求范围,请在检票口中使用 LoadableDetachableModels。
    【解决方案2】:

    Spring 支持请求和会话范围,但不知道 Wicket 页面范围是什么。不过不用担心。如果你在页面中注入一个图形工厂,你可以这样做:

    public class Page extends WebPage {
        @SpringBean private GraphFactory factory;
        private ObjectGraph graph = null;
    
        public Page() {
            ...
        }
    
        protected ObjectGraph getGraph() {
            if (graph == null) graph = factory.createGraph();
            return graph;
        }
    }
    

    创建图表后,它将按预期与您的页面一起序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2020-11-21
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多