6

我正在制作一个要集成 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 注释(无论如何这都是个坏主意 - 事务属于更深层次)。 这个说法有效吗?

4

1 回答 1

7

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

1.使用@SpringBean

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

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

我的组件.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 应用程序。如果您不构建大型应用程序,这可能是一个可行的替代方案。

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

3.@Transactional

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

于 2012-12-27T13:19:20.220 回答