我有两个maven项目说MvnSpring和MvnGuice.MvnSpring正在研究spring和hibernate框架的工作原理。 MvnGuice正在开发谷歌guice和mybatis。我需要将这两个功能结合在一起。 两者都遵循单身模式。我需要在编码时在MvnGuice中获得一些MvnSpring类。因此,我创建了一个MvnSpring罐并将其放在.m2存储库中,并在MvnGuice中提供了依赖性细节。现在我可以在MvnGuice类中导入MvnSpring类.MvnSpring使用spring依赖注入,MvnGuice使用guice依赖注入来创建对象。现在在MvnSpring流程中是MSserviceImpl(实现MSservice)> MSdaoImpl(实现MSdao)。现在我需要从MvnGuice调用MSService类。然后在运行时它显示错误,如MSService类为null。然后我在MvnGuice中为MSService类做了一个guice依赖注入。现在控件到达MSserviceImpl但现在MSdao在这里为空。是否有可能与MvnGuice一起启动MvnSpring。我希望我能解决这个问题。
答案 0 :(得分:2)
虽然Spring和Guice针对同一个问题,IoC,他们采取了截然不同的方法来解决它。它们在功能和配置方式上都有所不同,其中Spring有bean定义,Guice使用绑定。
幸运的是,他们确实有共同点,因为他们都支持JSR-330,这是一个定义一组注释的标准规范。这使您能够编写单身人士并描述他们需要的注射,而不依赖于Spring或Guice。
通过这种方式,无论您在特定项目中使用哪种框架,都可以在项目之间共享您的单例。我不建议在同一个项目中同时使用Guice和Spring,除非它们之间有明确的分隔。例如,您可以将Guice用于Spring代码通过定义的API使用的模块,该模块隐藏了内部基于Guice的事实。
答案 1 :(得分:1)
已经提到过JSR-330。 在某些情况下,它可能还不够,例如,您有代码:
final String className = config.getProperty(«serviceImpl»);
// Class.forName(name) and check required interface for type safety
final Class<? extends Service> serviceClass = Reflection.classForName(className, Service.class);
final Service service = injector.getInstance(serviceClass);
在不同的DI环境中,您应该同时支持com.guice.inject.Injector.getInstance()和org.springframework.context.ApplicationContext.getBean()实现。
草案解决方案sdif4j简单依赖注入外观。 这个项目的想法是用自己的抽象封装不同的DI框架逻辑,以扩展默认的JSR-330可能性。请注意,目前还没有公开发布,但您可以找到如何解决问题或在fork中进行内部发布的想法。 一般的问题是,你的MvnSpring和MvnGuice项目都应该基于JSR-330(而不是guice / spring注释)和org.sdif4j:sdif4j-api(或者你自己的抽象;只有在需要Injector功能的情况下) 。建议使guice和spring依赖项可选(编译但不导出)以允许库客户机自己选择DI。 在您的MvnCompineGuiceAndSpring中,您只需声明sdif4j-guice或sdif4j-spring依赖(它类似于slf4j用法)并配置您的DI环境。您可以在测试子项目中找到不同的示例。
更多说明: Spring的默认范围是singleton,Guice - prototype(Spring术语)。所以,如果你想要一个原型bean,你可以使用:
@org.springframework.context.annotation.Scope("prototype")
@javax.inject.Named
public class TestPrototype {
}
即使在类路径中没有spring,Spring也会忽略Spring @Scope注释。 此外,您必须使用@ javax.inject.Named和@ javax.inject.Singleton注释声明所有Singleton bean以支持Spring和Guice,如下所示:
@javax.inject.Named
@javax.inject.Singleton
public class TestSingleton implements ITestSingleton {
public TestSingleton() {
}
}
与@Scope注释一样,您可以在代码上使用@ImplementedBy(@ProvidedBy)guice注释(在可行的情况下;小心一点,一般来说这不是一个好习惯),在Spring DI中也应该忽略它(在两种情况下,如果Spring存在于类路径中或不存在)。
希望,那很清楚。