2011-09-30 67 views
1

我有两个maven项目,说MvnSpring和MvnGuice.MvnSpring正在研究春季和冬眠框架的作品。 MvnGuice正在研究谷歌guice和mybatis。我需要将这两个功能结合在一起。 两者都遵循单例模式。编码时我需要在MvnGuice中获得一些MvnSpring。为此,我创建了一个MvnSpring的jar,并将其放入.m2存储库,并在MvnGuice中提供依赖关系详细信息。现在我可以在MvnGuice类中导入MvnSpring类.MvnSpring使用spring依赖注入,MvnGuice使用guice依赖注入来创建对象。现在在MvnSpring流程中是MSserviceImpl(实现MSservice)> MSdaoImpl(实现MSdao)。现在我需要从MvnGuice中调用MSService类。然后在运行时显示错误,如MSService类为null。然后我在MvnGuice中为MSService类做了一个guice依赖注入。现在控件到达MSserviceImpl,但现在MSdao在这里为null。是否有可能与MvnGuice一起启动MvnSpring。我希望我能解决这个问题。在两个框架上结合两个基于maven的项目

回答

2

虽然Spring和Guice针对同一个问题IoC,但他们采用完全不同的方法来解决它。它们在功能和配置方式上有所不同,Spring有bean定义,Guice使用绑定​​。

幸运的是,它们有共同的理由,它们都支持JSR-330这一定义了一组注释的标准规范。这使您能够编写单例并描述他们需要的注入,而不依赖于Spring或Guice。

这样,无论您在特定项目中使用的框架如何,您都可以在项目之间共享您的单身人士。我不会推荐在同一个项目中同时使用Guice和Spring,除非它们之间有明确的分隔。例如,你可以使用Guice作为Spring代码通过定义的API使用的模块,它隐藏了它在内部基于Guice的事实。

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的可能性。请注意,目前还没有公开发布,但您可以找到如何解决问题或在分支中进行内部发布的想法。 一般问题是,你的MvnSpring和MvnGuice项目都应该基于JSR-330(而不是guice/spring注释)和org.sdif4j:sdif4j-api(或者你自己的抽象;只有需要注入器功能)。建议使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的@Scope注解应该由吉斯即使弹簧不会出现在你的classpath被忽略。 还必须声明你的所有辛格尔顿豆@ javax.inject.Named和@ javax.inject.Singleton注解支持Spring和吉斯,像这样:

@javax.inject.Named 
@javax.inject.Singleton 
public class TestSingleton implements ITestSingleton { 
    public TestSingleton() { 
    } 
} 

与@Scope注解,你可以在你的代码中使用@ImplementedBy(@ProvidedBy)guice注释(在可行的情况下;小心使用它,通常这不是一个好习惯),这在Spring DI中也应该被忽略(在这两种情况下,如果Spring存在于classpath中)。

希望,很明显。