gpt4 book ai didi

java - 使带注释的困惑远离领域模型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:19 25 4
gpt4 key购买 nike

我现在的情况是我有一个干净的领域模型。我所说的干净是指它只是私有(private)属性以及 getter 和 setter 的集合。我想这就是贫血数据模型所要解决的问题。

此模型可与其他应用程序互换(可以与其他应用程序代码共享),而无需引入额外的依赖项。

此模型需要序列化为不同的数据格式。为此,我可以使用范围广泛的注释来极大地简化我的生活。

只有他们在共享域模型的所有项目中引入一组额外的依赖项。我读过不建议出于这些原因使领域模型困惑,我可能会陷入 Jar Hell。

我可以编写一个带注释的包装器,并在构造函数中传入域模型,然后将所有属性复制到带注释的模型中。这样我就可以愉快地使用注解,同时保持干净的域模型,不会强制执行任何额外的依赖关系。

这不是专门关于序列化您的数据模型,而是关于在您的域模型中添加额外的功能(例如通过注释)以强制执行新的依赖关系。

您如何处理此类用例,而无需担心 Jar Hell 的安全处理方式是什么?

最佳答案

你只需要在编译时使用注解。如果注释类在运行时不可用,它们将根本不存在。

例如如果客户端代码调用 AnnotatedElement.getAnnotations()域模型类及其编译时使用的注释在类路径中不可用,它们将不会被返回。

如果你使用 maven,你应该声明注释依赖,范围是可选的。可选依赖项不会包含在客户端中。因此,它们仅在客户声明时可用。

例如:

如果 Proj-A 对 Proj-B 有一个可选的依赖( ?-> )

 Proj-A ?-> Proj-B 

并且 Proj-X 将 Proj-A 引用为编译依赖项,它将不会获得可选的依赖项 Proj-B。

 Proj-X -> Proj-A 

因为传递依赖解析以可选依赖结束。

预计在名为 annotations.jar 的 jar 文件中有以下注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ARuntimeAnnotation {

}

并且您在 model.jar

中包含以下模型类
@ARuntimeAnnotation
public class Model {

}

并且 model.jar 依赖于 annotations.jar,因为它需要它来编译。

<depdendency>
<groupId>someGroup</groupId>
<artifactId>annotations</artifactId>
<scope>optional</scope>
</dependency>

如果此依赖项是可选的,它将不会自动成为某人的传递依赖项,因为它只依赖于 model.jar

现在客户想要使用 Model 类。因此它依赖于 model.jar

 <depdendency>
<groupId>someGroup</groupId>
<artifactId>model</artifactId>
</dependency>

如果客户端还想看到注释 ARuntimeAnnotation 它也必须包括annotations.jar 作为依赖项,因为它是可选的。

如果客户端不包含对 annotations.jar 的依赖,则以下调用将返回一个空数组:

 Model.class.getAnnotations(); // will be empty if the annotations.jar is not available at runtime

关于java - 使带注释的困惑远离领域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com