注释嵌套注释_注释梦Night
注釋嵌套注釋
等待。 什么? 這真的是我們所要達成的目標嗎? 我什至看不到這個膨脹下的該死的財產。 這怎么發生的? 是的-我們不得不以某種方式擺脫舊的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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑老显卡图片卡死了咋办(电脑显卡卡住了
- 下一篇: 电脑桌面软件分类(电脑桌面软件怎么分类)