JNDI 作为服务定位器设计模式不好吗?
Is JNDI bad as service locator design pattern?
我是一名 Java EE 新手开发人员,根据互联网上的许多资源,声称服务定位器设计模式是一种反模式,因为它隐藏了 类 依赖项和更多东西,应该尽可能避免使用依赖注入,因为我们知道 JNDI 是服务定位器模式的实现。
我用谷歌搜索检查 JNDI 是否是服务定位器的一个实现,我发现这个响应声称:Understanding JNDI
尽管我看到 JNDI 在 Java EE 应用程序中用于多种用途(数据源、EJB 查找...),那么我应该使用它还是应该尽可能避免使用它?如果JNDI 不错,那么服务定位器不好吗?
我认为你的问题的一部分,服务定位器好不好或者JNDI是否是关于这个模式的,有点深奥。作为一名多年的软件架构师,我可以在这里给出一个一般性的建议,模式本身并不好也不坏,它只是以前在许多情况下成功使用的一个解决方案,因此被宣布为模式以便用于以后类似的案例。另一件事是,与许多年前相比,当一个人必须熟记 GoF 书才能通过面试时,如今了解 Java EE 等框架的基本概念更为重要而不是实施所有这些模式,因为您必须实施的通常非常简单明了,但使用它们依赖于这些概念。
关于你问题的第二部分,你几乎从不需要直接使用 JNDI,而是使用构建在它之上的概念,如注入——这就是你应该在你的应用程序中使用的东西。
恕我直言,这是一个可怕的模式,因为它是一个巨大的安全漏洞。如果依赖关系在编译时是已知的并且不会改变,那么审计、控制和控制可能的漏洞就容易得多。即使在组织内部,JDNI 也是一种等待被用于恶意用途的特洛伊木马,如果坏人无法破坏其他区域和您的网络,则可以通过 poorly/unwittingly 实现的应用程序加载他们想要的任何内容。这个 log4j 崩溃证明了这一点:不允许应用程序随时随地查找和加载任何内容。这是一个愚蠢的想法。不安全。
在业务环境中,我们最终需要跨应用程序的不同类型的数据,因此将它们存储在共享位置是有意义的。例如,您可能有一组共享同一组用户的应用程序,我们需要每个应用程序的授权信息,列出他们拥有的角色,以便我们知道他们需要访问什么。那种东西进入 LDAP 数据存储,您可以将其视为为快速读取访问而优化的分层数据库。
各种各样的东西都可以放在这些数据存储中,例如,应用程序服务器在其中存储连接池是很正常的。其中很多,例如用户、角色和连接池,都是您完成工作所需的重要内容。
JNDI 是用于访问这些 LDAP 数据存储的标准JavaAPI。
服务定位器设计模式令人讨厌的地方在于,执行查找的客户端代码必须对它正在查询的内容了解太多(主要是从哪里获取),并且必须对该查找进行硬编码在客户端中使代码不灵活且难以测试。但是,如果我们使用依赖注入(无论是 CDI,Spring,随便什么),我们就可以让框架将我们想要的值注入到代码中,而 JNDI 查找是在框架代码中处理的,而不是在应用程序中处理的。这意味着您可以使用 JNDI,而您的应用程序代码不必使用服务定位器模式。
我是一名 Java EE 新手开发人员,根据互联网上的许多资源,声称服务定位器设计模式是一种反模式,因为它隐藏了 类 依赖项和更多东西,应该尽可能避免使用依赖注入,因为我们知道 JNDI 是服务定位器模式的实现。
我用谷歌搜索检查 JNDI 是否是服务定位器的一个实现,我发现这个响应声称:Understanding JNDI
尽管我看到 JNDI 在 Java EE 应用程序中用于多种用途(数据源、EJB 查找...),那么我应该使用它还是应该尽可能避免使用它?如果JNDI 不错,那么服务定位器不好吗?
我认为你的问题的一部分,服务定位器好不好或者JNDI是否是关于这个模式的,有点深奥。作为一名多年的软件架构师,我可以在这里给出一个一般性的建议,模式本身并不好也不坏,它只是以前在许多情况下成功使用的一个解决方案,因此被宣布为模式以便用于以后类似的案例。另一件事是,与许多年前相比,当一个人必须熟记 GoF 书才能通过面试时,如今了解 Java EE 等框架的基本概念更为重要而不是实施所有这些模式,因为您必须实施的通常非常简单明了,但使用它们依赖于这些概念。
关于你问题的第二部分,你几乎从不需要直接使用 JNDI,而是使用构建在它之上的概念,如注入——这就是你应该在你的应用程序中使用的东西。
恕我直言,这是一个可怕的模式,因为它是一个巨大的安全漏洞。如果依赖关系在编译时是已知的并且不会改变,那么审计、控制和控制可能的漏洞就容易得多。即使在组织内部,JDNI 也是一种等待被用于恶意用途的特洛伊木马,如果坏人无法破坏其他区域和您的网络,则可以通过 poorly/unwittingly 实现的应用程序加载他们想要的任何内容。这个 log4j 崩溃证明了这一点:不允许应用程序随时随地查找和加载任何内容。这是一个愚蠢的想法。不安全。
在业务环境中,我们最终需要跨应用程序的不同类型的数据,因此将它们存储在共享位置是有意义的。例如,您可能有一组共享同一组用户的应用程序,我们需要每个应用程序的授权信息,列出他们拥有的角色,以便我们知道他们需要访问什么。那种东西进入 LDAP 数据存储,您可以将其视为为快速读取访问而优化的分层数据库。
各种各样的东西都可以放在这些数据存储中,例如,应用程序服务器在其中存储连接池是很正常的。其中很多,例如用户、角色和连接池,都是您完成工作所需的重要内容。
JNDI 是用于访问这些 LDAP 数据存储的标准JavaAPI。
服务定位器设计模式令人讨厌的地方在于,执行查找的客户端代码必须对它正在查询的内容了解太多(主要是从哪里获取),并且必须对该查找进行硬编码在客户端中使代码不灵活且难以测试。但是,如果我们使用依赖注入(无论是 CDI,Spring,随便什么),我们就可以让框架将我们想要的值注入到代码中,而 JNDI 查找是在框架代码中处理的,而不是在应用程序中处理的。这意味着您可以使用 JNDI,而您的应用程序代码不必使用服务定位器模式。