注册 Sling Servlet 的方法 - Adob​​e AEM/CQ

Ways of registering a Sling Servlet - Adobe AEM/CQ

根据 documentation

有两种注册 Sling Servlet 的方法

首先是@SlingServlet

@SlingServlet(
    resourceTypes = "sling/servlet/default",
    selectors = "hello",
    extensions = "html",
    methods = "GET")
    public class MyServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        ...
    }
}

第二次使用@Properties

@Component(metatype = true)
@Service(Servlet.class)
@Properties({
    @Property(name = "sling.servlet.resourceTypes", value = "sling/servlet/default"),
    @Property(name = "sling.servlet.selectors", value = "hello"),
    @Property(name = "sling.servlet.extensions", value = "html"),
    @Property(name = "sling.servlet.methods", value = "GET")
})
public class MyServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        ...
    }
}

文档未列出特定方法相对于其他方法的任何优势。我的一位团队成员问过这个问题。我能想到的一件事是 @Properties 允许我们提供可配置的属性,这些属性可以从 OSGi 控制台更改(http://localhost:4502/system/console/components,假设 CQ 在本地端口 4502 上 运行)。使用特定方法有区别或优势吗?

@SlingServlet 减少了创建 servlet 所需的样板文件。您列出的某些属性(例如 methods = "GET")已默认设置,因此您无需重新配置。总之,它使注释更加简洁。

在内部,就像所有 SCR 注释一样,注释被翻译成 XML 文件,因此您无法仅通过查看部署了代码的实例来区分 servlet 是如何实现的。

如果您要指定供应商或服务说明,您可以添加额外的 @Property 定义。请注意,后一个实际上在 @SlingServlet 注释中可用,所以再次使用它 - 你会直接从中受益!

我还建议您阅读我的 collegue who described some of the AEM development best practices (including your case of @SlingServlet). You can find it here

的精彩介绍