日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

注释嵌套注释_注释梦Night

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 注释嵌套注释_注释梦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 })

參考: “ 成為更好的開發者”博客上來自我們JCG合作伙伴 Gregor Riegler 的注釋夢 m。

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

注釋嵌套注釋

總結

以上是生活随笔為你收集整理的注释嵌套注释_注释梦Night的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。