注释嵌套注释

@XmlElementWrapper(name="orders")
@XmlJavaTypeAdapter(OrderJaxbAdapter.class)
@XmlElements({@XmlElement(name="order_2",type=Order2.class),@XmlElement(name="old_order",type=OldOrder.class)
})
@JsonIgnore
@JsonProperty
@NotNull
@ManyToMany
@Fetch(FetchMode.SUBSELECT)
@JoinTable(name = "customer_order",joinColumns = {@JoinColumn(name = "customer_id", referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "order_id", referencedColumnName = "id")}
)
private List orders;

等待。 什么? 这真的是我们所要达成的目标吗? 我什至看不到这个膨胀下的该死的财产。 这怎么发生的? 是的-我们不得不以某种方式摆脱旧的xml配置恐怖。 但是这个? 这甚至更糟。 此类应该是一堆具有许多特性的真棒pojo。 简洁明了,易于阅读。 作为本案例的读者,我对数据库表如何将客户加入订单完全不感兴趣。 我对它的序列化都不感兴趣。 这只是实现细节。 阅读此课程,我生活在对象世界中,我想知道对象具有哪些数据和行为。 不多不少。 我暂时不在乎列名,fetchtypes或json序列化。 而且我不想为了更改表名而读取,更改或重新编译此类。 我也不想添加另一个用于将该实体存储在mongoDB中的注释。 实体不应对这些细节负责。 我们不仅在这里违反了单一责任原则,还在做责任方。

好吧好吧,足够的愤怒。 我们如何处理这个问题? 一些实体将实体复制到具有不同注释目的的各个层。 他们使用自动映射器(如Dozer)将实体映射到与下一层相关的实体。 有些人甚至自己写了那个映射。 但这绝不是解决方案。 它只是将一种代码气味替换为另一种:重复。

因此,请专注于不会强迫您使代码混乱的框架。 jOOQ是将数据库记录映射到没有注释的实体的不错的解决方案。 另外,hibernate允许您以XML定义映射。

专用场注入

@Inject
private MyService myService

这是很经常使用的,尽管它甚至是不可能的。 myService字段是私有的,因此无法从类外部访问。 然而,这是有可能的,人们会这样做。 实际上,这是一个hack。 DI框架使用setAccessible(true)进行反射来设置字段。 您不想在您的代码中被黑客入侵,对吗? 让我们来看看替代方案:

二传手注射

好吧,至少它比私有域注入更好,因为它使用公共方法而不是侵入私有域。 但是,仍然要问自己:“这个阶级是否应该在没有注入价值的情况下生活?” 因为如果不是这样,就没有理由在没有MyService实例的情况下构造该类。 您想在类级别和构造函数内部而不是在框架级别实现此约束。

构造函数注入

这通常是要走的路。 它可以让你

  • 使字段不变(通常无需更改)。
  • 实现约束,即在正确的位置没有给定的MyService ,该类不可实例化。

当然,这意味着您不能通过注解进行注入。 但是为什么要呢? 该类不需要知道,它是否通过DI容器或工厂类进行注入。 它应该对此一无所知。 没有@Autowired,没有@Qualifier。 它只需要知道自己的行为即可。 其他所有内容都应在课堂之外处理。

可以使用配置类或文件进行实际注入。

DI容器是有用的工具,可帮助您将类连接在一起。 为此,请使用它,但不要让它支配您的代码。 Bob叔叔写了一篇很棒的文章 ,他在其中解释了如何使用DI-Frameworks而不要求他们指定您的代码。

UnitTests中的@RunWith(SpringJUnit4ClassRunner.class)

为什么在单元测试中需要此功能? 因为它是由您的IDE /应用程序模板自动生成的? 没有! 您想测试一个类的行为,它孤立地存在于单元测试中。 如果DI-Conainer正在相应地注入字段,则不会。 只需将自己注入设置方法即可。 无需DI容器。 顺便说一下,这个testrunner所做的只是这三行代码。

private TestContextManager testContextManager;
//..
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);

它们不值得阻塞您唯一的TestRunner插槽。 您想免费使用它进行参数化@RunWith(JUnitParamsRunner.class)或并发@RunWith(ConcurrentJunitRunner.class)测试。

@Override

确实,我的IDE已经知道我是否正确覆盖了方法。 对我来说,这只是混乱。

@SuppressWarnings

…甚至不让我开始

tl; dr

这些天来,注释变得比有害有用。 我们应该回到pojos上,并专注于保持我们的代码尽可能整洁和与框架无关,以使其更具可读性和可重用性。 不要让框架支配您的代码库,因为它们应该是可交换的工具。 当心一个班级应该知道什么,什么不知道。 一些注释有用,而大多数却没有。

@DevNull({@SuppressWarnings@Autowired, @Inject, @Override,  @XmlElementWrapper,@XmlJavaTypeAdapter,@XmlElement,@JsonIgnore,@JsonProperty,@ManyToMany,@Fetch,@JoinTable
})
参考: “ 成为更好的开发者”博客上来自我们JCG合作伙伴 Gregor Riegler 的注释梦 m。

翻译自: https://www.javacodegeeks.com/2014/01/an-annotation-nightmare.html

注释嵌套注释

注释嵌套注释_注释梦Night相关推荐

  1. 注释嵌套注释_注释,无处不在的注释

    注释嵌套注释 十年前的2004年 , Java 1.5开始提供注释. 很难想象没有此功能的代码. 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性. 考虑一下J2EE ...

  2. 注释嵌套注释_DIY注释

    注释嵌套注释 从Java 5开始,Java中出现了注释. 我想做一个自己的注释,只是为了看看需要什么. 但是,我发现它们只是接口. 有擦 接口后面没有牙. 必须执行一些代码. 我认为这是橡胶行之有效的 ...

  3. c语言注释不能嵌套什么意思,C语言嵌套注释问题

    问题来源:<C陷阱与缺陷> 练习1-1.某些C编译器允许嵌套注释.请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现 ...

  4. HTML嵌套注释、多行注释、多级注释,提高生产力

    HTML嵌套注释插件:HTML-Comment 概述 相信我,这是市面上最好用的HTML注释插件,因为这是我体验过很多主流插件后才开发出的工具. 很多人在使用html的注释嵌套使用时都会发现并不能达到 ...

  5. c语言注释的嵌套,C语言嵌套注释

    主流的C/C++/Java/C#等语言,都将注释语法设计成不可嵌套的. 如: /* xxx /* yyy */ zzz */ 是非法的. 理由: 注释是用于写描述性语言的,嵌套会使得可读性更差. 但事 ...

  6. python中注释的快捷键_总算懂了python注释快捷键

    ython中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的.注下面是小编为您整理的关于python注释快捷键,希望对你有所帮助. Python多行代码注释快捷键 选中要注释的代码,按 ...

  7. java如何快速取消注释_关于Java:Eclipse注释/取消注释快捷方式?

    我认为这很容易实现,但是到目前为止,我还没有在Java class editor和jsf faceted webapp XHTML file editor上找到注释/取消注释快捷方式的解决方案: 快速 ...

  8. ctrl+/加注释,去注释_关于以下内容的注释:2014年Google I / O上的“绩效文化”

    ctrl+/加注释,去注释 At Google I/O 2014, Lara Swanson and Paul Lewis discussed performance culture. Since i ...

  9. java接口废弃注释_Java注释Override、Deprecated、SuppressWarnings详解

    四.如何对注释进行注释 这一节的题目读起来虽然有些绕口,但它所蕴涵的知识却对设计更强大的java程序有很大帮助. 在上一节讨论了自定义注释,由此我们可知注释在J2SE5.0中也和类.接口一样.是程序中 ...

最新文章

  1. Xcode 5.0.1安装插件:规范注释生成器VVDocumenter + OSX 10.9.2
  2. 红黑树:自平衡的二叉查找树
  3. word文档怎么限制编辑(禁止编辑、只读)?
  4. .NET项目发布网站具体步骤和注意事项
  5. java 如何实现计数_如何高效的实现一个计数器map
  6. 根据guid读取Opportunity的技术实现
  7. python内建时间模块 time和datetime
  8. 【ECS最佳实践】基于多块云盘构建LVM逻辑卷
  9. python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
  10. prd移动端通用产品需求文档+Axure高保真app社交订餐通用prd文档+产品业务说明+PRD功能性需求+移动端公工通用模板说明+需求分析+竞品分析+产品结构图+产品业务流程图+产品信息图+餐饮系统
  11. Nodejs Web模块( readFile 根据请求跳转到响应html )
  12. MacOS Monterey 12.2 (21D49) OC 0.7.8 / Cl 5143 / PE 三分区原版黑苹果镜像
  13. 最新全志超清4K视频编解码芯片-V316处理器
  14. U-Net - Convolutional Networks for Biomedical Image Segmentation论文翻译——中英文对照
  15. 鼠标失灵了?我来给你解决吧!
  16. 百度地图api--定位当前的位置
  17. 美团二面:让你怀疑人生的数据结构算法夺命连环17问~
  18. 商城系统:包含用户注册/用户登陆/商品浏览/我的购物车功能.
  19. VueJS之v-bind:key爬坑
  20. 品牌营销策略——该如何与用户“谈恋爱”?

热门文章

  1. 【DP】Rotating Substrings(CF1363F)
  2. 【动态规划】农田个数 (ssl 1633)
  3. Spark入门(二)多主standalone安装
  4. JavaFX 2.1:Toolkit not initialized
  5. JavaFX UI控件教程(十四)之Tree View
  6. Oracle入门(十四.16)之捕获用户定义的异常
  7. jdk的安装与环境变量的配置
  8. hibernate+oracle+servlet实现插入数据的时候,不立马显示!!
  9. JavaScript实现搜索框效果
  10. php 输出01,php基础01_thinkphp输出Hello World-Go语言中文社区