Wicket与Spring集成

cod*_*ish 6 java spring wicket

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

  1. 使用注释aprroach.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);
        }
      }; 
    
    Run Code Online (Sandbox Code Playgroud)
  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在在你的组件中,打电话

    .YourWicketApp.get()getServiceA();

我想知道哪种是将弹簧与检票口整合的最佳方法,以及每种情况下的缺点.

但是据我记得Wicket页面和组件没有被Spring容器管理的,所以你不能使用他们@Transactional注解(这是一个不好的想法-交易属于更深层次). 这个陈述有效吗?

RJo*_*RJo 7

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

1.使用 @SpringBean

@SpringBean注释是好的.保证标有它的字段不会与组件序列化.即,Wicket框架通过使每个分离周期中的字段无效来"管理"bean,因此您不必担心它.

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

MyComponent.java

public class MyComponent extends Panel {
    @SpringBean
    MyServiceA myServiceA;
}
Run Code Online (Sandbox Code Playgroud)

在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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

3. @Transactional

交易肯定不属于Wicket页面,应该在服务层处理.因为它是Wicket而不是Spring处理bean和组件实例化的注入@Transactional,所以如果我是正确的,那么注释将无法工作.