注释嵌套注释_注释梦Night
注釋嵌套注釋
等待。 什么? 這真的是我們所要達(dá)成的目標(biāo)嗎? 我什至看不到這個(gè)膨脹下的該死的財(cái)產(chǎn)。 這怎么發(fā)生的? 是的-我們不得不以某種方式擺脫舊的xml配置恐怖。 但是這個(gè)? 這甚至更糟。 此類應(yīng)該是一堆具有許多特性的真棒pojo。 簡(jiǎn)潔明了,易于閱讀。 作為本案例的讀者,我對(duì)數(shù)據(jù)庫(kù)表如何將客戶加入訂單完全不感興趣。 我對(duì)它的序列化都不感興趣。 這只是實(shí)現(xiàn)細(xì)節(jié)。 閱讀此課程,我生活在對(duì)象世界中,我想知道對(duì)象具有哪些數(shù)據(jù)和行為。 不多不少。 我暫時(shí)不在乎列名,fetchtypes或json序列化。 而且我不想為了更改表名而讀取,更改或重新編譯此類。 我也不想添加另一個(gè)用于將該實(shí)體存儲(chǔ)在mongoDB中的注釋。 實(shí)體不應(yīng)對(duì)這些細(xì)節(jié)負(fù)責(zé)。 我們不僅在這里違反了單一責(zé)任原則,還在做責(zé)任方。
好吧好吧,足夠的憤怒。 我們?nèi)绾翁幚磉@個(gè)問(wèn)題? 一些實(shí)體將實(shí)體復(fù)制到具有不同注釋目的的各個(gè)層。 他們使用自動(dòng)映射器(如Dozer)將實(shí)體映射到與下一層相關(guān)的實(shí)體。 有些人甚至自己寫了那個(gè)映射。 但這絕不是解決方案。 它只是將一種代碼氣味替換為另一種:重復(fù)。
因此,請(qǐng)專注于不會(huì)強(qiáng)迫您使代碼混亂的框架。 jOOQ是將數(shù)據(jù)庫(kù)記錄映射到?jīng)]有注釋的實(shí)體的不錯(cuò)的解決方案。 另外,hibernate允許您以XML定義映射。
專用場(chǎng)注入
@Inject private MyService myService這是很經(jīng)常使用的,盡管它甚至是不可能的。 myService字段是私有的,因此無(wú)法從類外部訪問(wèn)。 然而,這是有可能的,人們會(huì)這樣做。 實(shí)際上,這是一個(gè)hack。 DI框架使用setAccessible(true)進(jìn)行反射來(lái)設(shè)置字段。 您不想在您的代碼中被黑客入侵,對(duì)嗎? 讓我們來(lái)看看替代方案:
二傳手注射
好吧,至少它比私有域注入更好,因?yàn)樗褂霉卜椒ǘ皇乔秩胨接杏颉?但是,仍然要問(wèn)自己:“這個(gè)階級(jí)是否應(yīng)該在沒有注入價(jià)值的情況下生活?” 因?yàn)槿绻皇沁@樣,就沒有理由在沒有MyService實(shí)例的情況下構(gòu)造該類。 您想在類級(jí)別和構(gòu)造函數(shù)內(nèi)部而不是在框架級(jí)別實(shí)現(xiàn)此約束。
構(gòu)造函數(shù)注入
這通常是要走的路。 它可以讓你
- 使字段不變(通常無(wú)需更改)。
- 實(shí)現(xiàn)約束,即在正確的位置沒有給定的MyService ,該類不可實(shí)例化。
當(dāng)然,這意味著您不能通過(guò)注解進(jìn)行注入。 但是為什么要呢? 該類不需要知道,它是否通過(guò)DI容器或工廠類進(jìn)行注入。 它應(yīng)該對(duì)此一無(wú)所知。 沒有@Autowired,沒有@Qualifier。 它只需要知道自己的行為即可。 其他所有內(nèi)容都應(yīng)在課堂之外處理。
可以使用配置類或文件進(jìn)行實(shí)際注入。
DI容器是有用的工具,可幫助您將類連接在一起。 為此,請(qǐng)使用它,但不要讓它支配您的代碼。 Bob叔叔寫了一篇很棒的文章 ,他在其中解釋了如何使用DI-Frameworks而不要求他們指定您的代碼。
UnitTests中的@RunWith(SpringJUnit4ClassRunner.class)
為什么在單元測(cè)試中需要此功能? 因?yàn)樗怯赡腎DE /應(yīng)用程序模板自動(dòng)生成的? 沒有! 您想測(cè)試一個(gè)類的行為,它孤立地存在于單元測(cè)試中。 如果DI-Conainer正在相應(yīng)地注入字段,則不會(huì)。 只需將自己注入設(shè)置方法即可。 無(wú)需DI容器。 順便說(shuō)一下,這個(gè)testrunner所做的只是這三行代碼。
private TestContextManager testContextManager; //.. this.testContextManager = new TestContextManager(getClass()); this.testContextManager.prepareTestInstance(this);它們不值得阻塞您唯一的TestRunner插槽。 您想免費(fèi)使用它進(jìn)行參數(shù)化@RunWith(JUnitParamsRunner.class)或并發(fā)@RunWith(ConcurrentJunitRunner.class)測(cè)試。
@Override
確實(shí),我的IDE已經(jīng)知道我是否正確覆蓋了方法。 對(duì)我來(lái)說(shuō),這只是混亂。
@SuppressWarnings
…甚至不讓我開始
tl; dr
這些天來(lái),注釋變得比有害有用。 我們應(yīng)該回到pojos上,并專注于保持我們的代碼盡可能整潔和與框架無(wú)關(guān),以使其更具可讀性和可重用性。 不要讓框架支配您的代碼庫(kù),因?yàn)樗鼈儜?yīng)該是可交換的工具。 當(dāng)心一個(gè)班級(jí)應(yīng)該知道什么,什么不知道。 一些注釋有用,而大多數(shù)卻沒有。
@DevNull({@SuppressWarnings@Autowired, @Inject, @Override, @XmlElementWrapper,@XmlJavaTypeAdapter,@XmlElement,@JsonIgnore,@JsonProperty,@ManyToMany,@Fetch,@JoinTable }) 參考: “ 成為更好的開發(fā)者”博客上來(lái)自我們JCG合作伙伴 Gregor Riegler 的注釋夢(mèng) m。翻譯自: https://www.javacodegeeks.com/2014/01/an-annotation-nightmare.html
注釋嵌套注釋
總結(jié)
以上是生活随笔為你收集整理的注释嵌套注释_注释梦Night的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑老显卡图片卡死了咋办(电脑显卡卡住了
- 下一篇: MongoDB索引策略和索引类型