【问题标题】:Wicket integration with SpringWicket 与 Spring 的集成
【发布时间】:2012-12-27 10:07:41
【问题描述】:

我正在制作一个我想在其中集成 Wicket + Spring 的应用程序。应用程序是用户来购买东西的杂货店。我知道有两种方法可以做到这一点。

  1. 使用注释方法。 Wicket-Spring 集成展示了如何将 Spring Beans 注入 Wicket 页面的各种方法。

    public class FormPage extends WebPage
    {
      @SpringBean
      private IContact icontact;
      ...
      Form<Object> form = new Form<Object>("contactForm",
         new CompoundPropertyModel<Object>(contact))
      {
        private static final long serialVersionUID = 1L;
    
        protected void onSubmit(Contact contact)
        {               
          icontact.saveContact(contact);
        }
      }; 
    
  2. @SpringBean 当然是有效的,并且被许多人认为是最佳实践。但还有另一种方法,您的 Wicket 应用程序可以提供您需要的服务。

    public class YourWicketApp extends WebApplication{
      public static YourWicketApp get(){
        return (YourWicketApp) Application.get();
      }
      private ServiceA serviceA;
      // getter and setter for serviceA here
    }
    

    现在在你的组件中,调用

    YourWicketApp.get().getServiceA();

我想知道哪种方式是最好的将 spring 与 wicket 集成的方式,以及每种情况下的缺点是什么。

但是据我所知,Wicket 页面和组件不是由 Spring 容器管理的,因此您不能在它们上使用 @Transactional 注释(无论如何这都是个坏主意 - 事务属于更深层次)。 此声明有效吗?

【问题讨论】:

    标签: java spring wicket


    【解决方案1】:

    不同选项各有优缺点。 here 解释了不同的选项。就个人而言,我更喜欢基于注解的方法,因为它保证了注解字段的正确分离,并减少了组件对应用程序对象的依赖。

    1。使用@SpringBean

    @SpringBean 注释很好。保证标有它的字段不会与组件一起序列化。即,Wicket 框架通过在每个分离周期中取消字段来“管理”bean,因此您不必担心它。

    标有@SpringBean 的字段很容易测试,因为您总是可以用模拟替换它们。 Wicket 甚至有一个 ApplicationContextMock 类,当使用 WicketTester 时,bean 将从该类中注入:

    MyComponent.java

    public class MyComponent extends Panel {
        @SpringBean
        MyServiceA myServiceA;
    }
    

    在 MyComponentTest.java 中

    final ApplicationContextMock appContext = new ApplicationContextMock();
    appContext.putBean(mock(MyServiceA.class));
    Application app = new Application() {
        public void init() {
            ...
            getComponentInstantiationListeners().add(new SpringComponentInjector(this, appContext));
        }
    }
    WicketTester wicketTester = new WicketTester(app);
    wicketTester.startComponent(MyComponent.class);
    

    2。使用YourWicketApp.get().getServiceA()

    这是一种非常轻量级的方法,因为它不需要将 Spring 绑定到您的 Web 应用程序。如果您不构建大型应用程序,这可能是一个可行的替代方案。

    这种方法的主要缺点是可测试性差。由于您正在静态访问应用程序,因此您无法在测试中轻松替换应用程序。当然,您可以编写扩展YourWicketApp 的应用程序YourWicketAppForTests,但您将始终受限于该应用程序。通过这样做,您将创建从每个依赖于服务的组件到应用程序类的依赖关系。此外,您需要为每个服务类提供一个方法,这会增加应用程序类的混乱(通常一开始就不会太短)。

    3。 @Transactional

    事务绝对不属于 Wicket 页面,应该在服务层处理。因为是 Wicket 而不是 Spring 处理 bean 的注入和组件实例化,所以 @Transactional 注释无论如何都不起作用,如果我是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2015-02-06
      相关资源
      最近更新 更多