总体方法
在Apache Sling中进行依赖注入的最简单方法是使用 maven-scr-plugin,它也是代码库中普遍采用的方式。
您可以为自己的Java类添加注释,然后在构建时调用SCR插件,可以将其作为Maven插件或Ant任务来使用。
例如,要注册一个Servlet,您可以执行以下操作:
@Component
@Service(Servlet.class)
public class SampleServlet implements Servlet {
@Reference SlingRepository repository;
}
具体答案
声明式服务与Guice或Spring等“传统”DI相比如何?它们解决了同样的问题还是针对不同的问题?
它们解决了同样的问题——依赖注入。但是(见下文),它们也考虑到了服务可以随时出现或消失的动态系统。
到目前为止,我看到的所有OSGI特定解决方案都缺乏DI范围的概念。例如,Guice + guice-servlet具有请求范围的依赖项,这使得编写Web应用程序非常简洁和易于使用。我是在文档中漏掉了还是这些框架没有涵盖这些问题?
我没有看到SCR中添加会话范围或请求范围服务的任何方法。但是,SCR是一种通用方法,可以在更具体的层次上处理作用域。
由于您正在使用Sling,因此我认为很少需要会话范围或请求范围绑定,因为Sling为每个请求内置对象,这些对象适当地创建为当前用户。
一个很好的例子是JCR会话。它会自动构建具有正确权限的实践中请求范围的DAO。同样适用于Sling resourceResolver。
如果您发现自己需要每个用户的工作,则最简单的方法是拥有接收JCR Session
或Sling ResourceResolver
的服务,并使用它们执行所需的工作。无需任何额外的努力即可自动调整当前用户权限的结果。
JSR 330和基于OSGI的DI是两个不同的世界吗?例如,iPOJO带有自己的注释,而Felix SCR注释似乎是完全不同的领域。
是的,它们是不同的。您应该记住,尽管Spring和Guice更为主流,但OSGi服务更为复杂,支持更多用例。在OSGi捆绑包(以及隐式服务)中,自由地来来去去。这意味着当您有一个依赖于刚刚变得不可用的服务的组件时,您的组件将被停用。或者当您收到一系列组件(例如Servlet实现)并且其中一个被停用时,您会受到通知。据我所知,Spring和Guice都不支持这种方式,因为它们的连线是静态的。
这是OSGi给您的极大灵活性。
有人在构建基于OSGI的系统和DI方面有经验吗?甚至在github上有一些示例代码吗?
在Sling样本SVN存储库中有大量示例。您应该在那里找到大部分所需内容。
有人使用不同的技术,如Guice和iPOJO在一起吗,还是这只是一个疯狂的想法?
如果您的框架配置了JSR 330注释,则使用Guice或Spring或适合您的任何其他工具在运行时对其进行配置是有意义的。但是,正如Neil Bartlett指出的那样,这将无