我正在开发一个应用程序,希望在其中集成Wicket + Spring。应用程序是一家杂货店,用户在那里买东西。我知道有两种方法可以做到这一点。
,我想知道,这是将spring与wicket集成的最佳方法,在每种情况下都有哪些缺点。
然而,据我所知,Wicket页面和组件不是由Spring容器管理的,因此您不能在它们上使用@ transactions注释(这是个坏主意--事务属于更深层次)。这条语句有效吗?
发布于 2012-12-27 13:19:20
不同的选择有一定的优点和缺点。here解释了不同的选项。就我个人而言,我更喜欢基于注释的方法,因为它确保正确地分离带注释的字段,并减少组件对应用程序对象的依赖。
1.使用@SpringBean
@SpringBean注释很好。可以保证标记为它的字段不会被组件序列化。也就是说,Wicket框架通过取消每个分离周期中的字段来“管理”bean,这样您就不必担心它了。
标记为@SpringBean的字段很容易测试,因为您总是可以用模拟替换它们。Wicket甚至有一个ApplicationContextMock类,在使用WicketTester时将从该类注入bean:
MyComponent.java
public class MyComponent extends Panel {
@SpringBean
MyServiceA myServiceA;
}In 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注释将无法工作。
https://stackoverflow.com/questions/14052847
复制相似问题