保持注释的混乱远离域模型

时间:2013-08-20 07:08:54

标签: java annotations dependencies

我的情况是我有一个干净的域模型。通过清洁,我的意思是它只是一个私人财产和吸气剂和制定者的集合。我想这就是贫血数据模型的含义。

此模型可与其他应用程序互换(可与其他应用程序代码共享),而不会产生额外的依赖关系。

此模型需要序列化为不同的数据格式。为此,我可以使用各种注释来大大简化我的生活。

只有他们在将共享域模型的所有项目中引入一组额外的依赖项。 我已经读过,因为这样的原因,不建议混淆域模型,我可能会在Jar Hell中着陆。

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

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

你如何处理这些用例,在不必担心Jar Hell的情况下处理这个问题的安全方法是什么?

1 个答案:

答案 0 :(得分:2)

您只需在编译时使用注释。 如果注释类在运行时不可用,则它们将不存在。

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

如果您使用maven,则应声明注释依赖项,并使用scope可选。 可选的依赖项不会包含在客户端中。 因此,只有在客户声明它们时才可以使用它们。

例如:

如果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.jarannotations.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