注释嵌套注释_注释梦Night
注释嵌套注释
@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
})
翻译自: https://www.javacodegeeks.com/2014/01/an-annotation-nightmare.html
注释嵌套注释
注释嵌套注释_注释梦Night相关推荐
- 注释嵌套注释_注释,无处不在的注释
注释嵌套注释 十年前的2004年 , Java 1.5开始提供注释. 很难想象没有此功能的代码. 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性. 考虑一下J2EE ...
- 注释嵌套注释_DIY注释
注释嵌套注释 从Java 5开始,Java中出现了注释. 我想做一个自己的注释,只是为了看看需要什么. 但是,我发现它们只是接口. 有擦 接口后面没有牙. 必须执行一些代码. 我认为这是橡胶行之有效的 ...
- c语言注释不能嵌套什么意思,C语言嵌套注释问题
问题来源:<C陷阱与缺陷> 练习1-1.某些C编译器允许嵌套注释.请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现 ...
- HTML嵌套注释、多行注释、多级注释,提高生产力
HTML嵌套注释插件:HTML-Comment 概述 相信我,这是市面上最好用的HTML注释插件,因为这是我体验过很多主流插件后才开发出的工具. 很多人在使用html的注释嵌套使用时都会发现并不能达到 ...
- c语言注释的嵌套,C语言嵌套注释
主流的C/C++/Java/C#等语言,都将注释语法设计成不可嵌套的. 如: /* xxx /* yyy */ zzz */ 是非法的. 理由: 注释是用于写描述性语言的,嵌套会使得可读性更差. 但事 ...
- python中注释的快捷键_总算懂了python注释快捷键
ython中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的.注下面是小编为您整理的关于python注释快捷键,希望对你有所帮助. Python多行代码注释快捷键 选中要注释的代码,按 ...
- java如何快速取消注释_关于Java:Eclipse注释/取消注释快捷方式?
我认为这很容易实现,但是到目前为止,我还没有在Java class editor和jsf faceted webapp XHTML file editor上找到注释/取消注释快捷方式的解决方案: 快速 ...
- ctrl+/加注释,去注释_关于以下内容的注释:2014年Google I / O上的“绩效文化”
ctrl+/加注释,去注释 At Google I/O 2014, Lara Swanson and Paul Lewis discussed performance culture. Since i ...
- java接口废弃注释_Java注释Override、Deprecated、SuppressWarnings详解
四.如何对注释进行注释 这一节的题目读起来虽然有些绕口,但它所蕴涵的知识却对设计更强大的java程序有很大帮助. 在上一节讨论了自定义注释,由此我们可知注释在J2SE5.0中也和类.接口一样.是程序中 ...
最新文章
- Xcode 5.0.1安装插件:规范注释生成器VVDocumenter + OSX 10.9.2
- 红黑树:自平衡的二叉查找树
- word文档怎么限制编辑(禁止编辑、只读)?
- .NET项目发布网站具体步骤和注意事项
- java 如何实现计数_如何高效的实现一个计数器map
- 根据guid读取Opportunity的技术实现
- python内建时间模块 time和datetime
- 【ECS最佳实践】基于多块云盘构建LVM逻辑卷
- python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
- prd移动端通用产品需求文档+Axure高保真app社交订餐通用prd文档+产品业务说明+PRD功能性需求+移动端公工通用模板说明+需求分析+竞品分析+产品结构图+产品业务流程图+产品信息图+餐饮系统
- Nodejs Web模块( readFile 根据请求跳转到响应html )
- MacOS Monterey 12.2 (21D49) OC 0.7.8 / Cl 5143 / PE 三分区原版黑苹果镜像
- 最新全志超清4K视频编解码芯片-V316处理器
- U-Net - Convolutional Networks for Biomedical Image Segmentation论文翻译——中英文对照
- 鼠标失灵了?我来给你解决吧!
- 百度地图api--定位当前的位置
- 美团二面:让你怀疑人生的数据结构算法夺命连环17问~
- 商城系统:包含用户注册/用户登陆/商品浏览/我的购物车功能.
- VueJS之v-bind:key爬坑
- 品牌营销策略——该如何与用户“谈恋爱”?
热门文章
- 【DP】Rotating Substrings(CF1363F)
- 【动态规划】农田个数 (ssl 1633)
- Spark入门(二)多主standalone安装
- JavaFX 2.1:Toolkit not initialized
- JavaFX UI控件教程(十四)之Tree View
- Oracle入门(十四.16)之捕获用户定义的异常
- jdk的安装与环境变量的配置
- hibernate+oracle+servlet实现插入数据的时候,不立马显示!!
- JavaScript实现搜索框效果
- php 输出01,php基础01_thinkphp输出Hello World-Go语言中文社区