我对wicket中的DI有一些疑问:
我的业务层(在这种情况下是我的宁静网络服务)已经获得了春季DI吗?
两者之间的区别是什么?
我是否需要在wicket中使用对象和组件DI?
当我读到关于DI时,它说当我的资源位置发生变化时,我不必为此烦恼。这是什么意思?进口的罐子会改变吗?我想虽然在阅读了几篇关于它的文章之后我没有得到这个概念。
答案 0 :(得分:2)
O.K。一次有几个问题......
没有。 Wicket完美无需DI。就我而言(我是DI的忠实粉丝)我几乎只使用DI将DAO注入我的组件。这很好,很容易,但绝对没有必要。
假设你的意思是Wicket中的DI和你的业务层中的DI之间的区别......我知道没有区别。
这是一个我无法回答的问题,因为我不知道你在谈论什么。
关于最后一部分。我不知道哪些资源位置可能与DI有关。当您使用例如Guice for DI时,您可以在一个中心位置(模块)定义注入的对象,并相应地注释您的类。对于wicket组件,Wicket-Guice集成确保组件在创建时传递给Guice for Injection。对于其他对象,对Guice-Injector的调用大多数时间都会替换new
。这样,当您更改其中一个实现时,您只需修改一个类(模块),一切都得到处理(假设接口保持不变(相同的接口不是未修改的接口)。
答案 1 :(得分:2)
当我的业务层(在这种情况下是我的宁静网络服务)已经获得了春季DI时,我是否需要DI?
要获得对Spring bean的引用,您可以使用DI(@SpringBean
)或直接从Spring的应用程序上下文中获取它们:
WebApplication application = WebApplication.get();
ServletContext sc = application.getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
MyService myService = ctx.getBean(MyService.class);
两者之间的区别是什么?
假设'both'意味着Spring的DI和Wicket的DI(wicket-ioc),Wicket的DI知道Wicket的生命周期,并且会使它正常工作。
我的意思是,Wicket会在每次请求后序列化页面。如果使用@Autowire
将依赖项注入页面和组件,它将失败(如果注入的bean不是Serializable
),或者沿着页面序列化整个bean(这可能是一种不良行为)。
当您使用@SpringBean
向组件中注入依赖项时,注入的不是bean本身,而是可序列化的代理,它将根据需要查找真正的bean,并在请求后释放它(只是就像LoadableDetachableModel
对数据一样。)
如果您在每次需要时查找服务,而不是注入它,则不会出现此问题,因为没有引用作为类属性保留。
我是否需要wicket中的对象和组件DI?
假设'对象'表示'春天DI','组件'表示'Wicket DI',是和否。
Spring在注入服务方面要好得多,并且可以在Wicket的请求周期之外工作(例如,在Quartz预定的工作中)。 wicket-ioc
不会。
wicket-ioc
+ wicket-spring
只是Spring和Wicket之间的粘合剂。如果你想在你的组件和页面中使用依赖注入,我认为你应该使用它,因为Wicket的工作方式。
我认为自Spring 3.0以来,Spring的作用域代理(<aop:scoped-proxy/>
)也是可序列化的。他们还按需查找bean,就像wicket-ioc
一样,并且不受Wicket请求周期的约束。问题是,它们是在Spring配置中全局声明的,因此,MyService
的每个实例都将被代理,而不仅仅是注入Wicket组件的实例。并且,由于Wicket组件未被注入(每次需要时都会调用new
),“传统的”Spring注入机制将不起作用,您需要@Configured
和AspectJ编织之类的东西,或者在每个组件上调用ApplicationContext.getAutowireCapableBeanFactory().configureBean(bean, beanName)
。这可能是一个问题,取决于你的美学意义:)
当我读到DI时,它说当我的资源位置发生变化时,我不必为此烦恼。这是什么意思?进口的罐子会改变吗?我想虽然在阅读了几篇关于它的文章之后我没有得到这个概念。
在这种情况下,“资源”可能包括外部资源(如数据库连接池)和bean实现。如果数据库的IP发生更改,并且您将其硬编码到类中,则必须更改该类并重新编译它。如果它是在外部配置的(例如,在XML或属性文件中),则只需更改或替换它,这是一种更安全的操作。
在这种情况下,Spring的作用是提供一种非常灵活,通用的方法来进行外部配置。它还从代码中删除了服务bean的实例化,从而更容易更改具体类及其构造参数。