安卓清理垃圾清理代码_用方面清理代码
安卓清理垃圾清理代碼
在我以前的文章中,我描述了字母轉(zhuǎn)換,并且提到了我們使用AspectJ來解決該任務(wù),但是我沒有提及AspectJ的工作原理和一般性方面。 因此,在接下來的幾行中,我將解釋:- 什么是面向方面的編程,為什么我們需要它
- 什么是AspectJ
- 將AspectJ與Spring結(jié)合使用(配置AspectJ和spring一起工作)
- 我將解釋以前帖子中示例的各個(gè)方面。
什么是面向方面的編程以及我們?yōu)槭裁葱枰?/strong>
在軟件開發(fā)過程中,我們可以使用不同的編程范例,例如OOP(面向?qū)ο缶幊?#xff09;或POP(面向過程編程)。
今天,我們大多數(shù)人在軟件開發(fā)過程中使用面向?qū)ο蟮木幊谭椒▉斫鉀Q現(xiàn)實(shí)生活中的問題。
但是在我們的工作中,我們經(jīng)常遇到一些代碼,這些代碼貫穿我們的代碼庫,破壞了其模塊性并使它變得骯臟。
這部分代碼通常沒有業(yè)務(wù)價(jià)值,但是我們需要它們來解決問題。
例如,我們可以看一下數(shù)據(jù)庫事務(wù)。
事務(wù)對于我們的軟件非常重要,因?yàn)樗鼈円⒁鈹?shù)據(jù)的一致性。 啟動(dòng)和處理事務(wù)的代碼對于我們的應(yīng)用程序非常重要,但是它用于技術(shù)性工作(啟動(dòng),提交和回滾事務(wù))。 這些東西使得很難理解代碼的真正含義(查看代碼的實(shí)際業(yè)務(wù)價(jià)值)。
當(dāng)然,我不會(huì)在如何使用方面處理事務(wù)方面做任何示例,因?yàn)橛泻芏嗫蚣軙?huì)代替我們來處理事務(wù)。 我剛剛提到了事務(wù),因?yàn)槟赡苤廊绾问褂煤唵蔚腏DBC API將數(shù)據(jù)插入數(shù)據(jù)庫。
因此,為了使代碼更整潔,我們將使用設(shè)計(jì)模式,這是解決問題的一種好方法。 但是有時(shí)候使用設(shè)計(jì)模式也不會(huì)導(dǎo)致我們找到簡單的解決方案,并且我們大多數(shù)人都會(huì)訴諸于更簡單的解決方案,從而產(chǎn)生“骯臟”的代碼。
在這種情況下,我們應(yīng)該有機(jī)會(huì)采用面向方面的方法來解決問題。 當(dāng)我們考慮AOP時(shí),我們不應(yīng)該考慮對我們來說是全新的東西,而應(yīng)該考慮將AOP作為OOP的補(bǔ)充。 AOP可以簡化代碼模塊化,使代碼更整潔,并使我們更容易,更快地了解應(yīng)用程序的某些部分應(yīng)該做什么。
AOP引入了一些新概念,這將使我們更容易進(jìn)行代碼調(diào)制。 如果我們想有效地使用Aspects,我們需要了解其基本原理和術(shù)語。
當(dāng)我們開始使用AOP時(shí),我們將遇到一個(gè)新的終端:
- 橫切關(guān)注點(diǎn)是應(yīng)該在單獨(dú)的模塊中移動(dòng)的代碼(即用于處理交易的代碼)。
- 方面,它是一個(gè)包含關(guān)注點(diǎn)的模塊。
- 切入點(diǎn),我們可以將其視為指針,它將指示何時(shí)應(yīng)運(yùn)行相應(yīng)的代碼
- 建議,它包含一個(gè)代碼,當(dāng)?shù)竭_(dá)某個(gè)連接點(diǎn)時(shí)應(yīng)運(yùn)行該代碼。
- 內(nèi)部類型聲明,允許修改類結(jié)構(gòu)。
- 方面編織是協(xié)調(diào)與系統(tǒng)其余部分集成的機(jī)制。
我將在示例中最后說明它們是什么以及如何使用它們。
什么是AspectJ
AspectJ是Java編程語言的擴(kuò)展,它允許在Java編程語言中使用AOP概念。
使用AspectJ時(shí),無需在現(xiàn)有代碼中進(jìn)行任何更改。
AspectJ使用稱為Aspect的新結(jié)構(gòu)擴(kuò)展了Java,在AspectJ 5之后,您可以使用基于注釋的開發(fā)樣式。
AspectJ和Spring
Spring框架已經(jīng)提供了自己的AOP實(shí)現(xiàn)。 Spring AOP比AspectJ更簡單的解決方案,但它不如AspectJ強(qiáng)大。 因此,如果您想在Spring應(yīng)用程序中使用方面,那么在選擇AspectJ進(jìn)行工作之前,應(yīng)該熟悉Spring AOP的可能性。
在我們看到使用Aspect的示例之前,我將向您展示如何將AspectJ與Spring集成以及如何配置Tomcat以使其能夠在Spring中運(yùn)行AspectJ應(yīng)用程序。 在此示例中,我使用了方面的LTW(加載時(shí)間編織)。
因此,我將首先從Spring開始解釋如何做。 很簡單,只需在應(yīng)用程序配置文件中添加下一行:
<context:load-time-weaver aspectj-weaving="autodetect"/>這就是在彈簧配置中需要做的所有事情。
下一步是Tomcat的配置。 我們需要為應(yīng)用程序定義新的類加載器。 該類加載器需要能夠進(jìn)行加載時(shí)編織,因此我們使用:
<loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" /> 加載程序必須在Tomcat類路徑中,然后才能使用。
當(dāng)然,為了使此工作有效,我們需要?jiǎng)?chuàng)建aop.xml文件。 該文件包含將在類轉(zhuǎn)換過程中由類加載器使用的指令。
這是我用于字母轉(zhuǎn)換的aop.xml文件的示例。
對于愿意嘗試AspectJ的所有人來說,最后一個(gè)xml文件最為有趣。 它指示AspectJ編織過程。
編織器部分包含有關(guān)應(yīng)編織的信息。 因此,此文件將在其中包括所有類:
- ba.codecentric.medica.model。*
- ba.codecentric.medica .. *。service。*
- ba.codecentric.medica.controller .. *
- ba.codecentric.medica.utils.ModelMapper
- ba.codecentric.medica.utils.RedirectHelper
- ba.codecentric.medica.aop.aspect.CharacterConvertionAspect
- ba.codecentric.medica.security.UserAuthenticationProvider
- ba.codecentric.medica.wraper.MedicaRequestWrapper
因此,第一行包括模型包中的所有類。 第二個(gè)類包括所有類,它們是ba.codecentric.medica包(即ba.codecentric.medica.hospitalisation.service)內(nèi)的service子包的一部分。 第三個(gè)包括控制器軟件包下面的所有內(nèi)容。 其余各行包括指定的類。
選項(xiàng)屬性定義在編織過程中應(yīng)使用的附加選項(xiàng)。 因此,在此示例中-Xset:weaveJavaxPackages = true指示AspectJ也編織Java包。
方面部分包含將在編織過程中使用的方面的列表。 有關(guān)使用xml配置的更多信息,請參見AspectJ文檔 。
使用示例AspectJ
我更喜歡使用注釋,因此下一個(gè)示例將向您展示如何將AspectJ與注釋一起使用。 從AspectJ 5版本開始,可以使用AspectJ進(jìn)行注釋驅(qū)動(dòng)的編程。這是一些完整方面的代碼,其中包含用于字母轉(zhuǎn)換的注意事項(xiàng)。
首先,我們可以看到該類使用@Aspect注釋進(jìn)行了注釋。 這表明此類實(shí)際上是一個(gè)方面。 Aspect是一種包含類似跨領(lǐng)域關(guān)注點(diǎn)的構(gòu)造。 因此,我們可以將其視為包含交叉代碼的模塊,并定義何時(shí)使用代碼以及如何使用。
@Around("execution(public void ba.codecentric.medica.model..*.set*(java.lang.String))") public Object convertCharactersToLat(ProceedingJoinPoint pjp) throws Throwable {Object value = pjp.getArgs()[0];LOG.debug("Converting value:" + value + ", before persisting");if (value instanceof String) {value = getConverter().convertCharacters((String) value, CharacterConverter.TO_LAT);}return pjp.proceed(new Object[] { value }); } 這是一種使用@Around注釋進(jìn)行注釋的方法。 周圍注釋用于表示周圍建議。 我已經(jīng)提到過,建議是包含跨領(lǐng)域代碼的地方。 在此示例中,我僅使用了“周圍”建議,但是除了在返回之前,之后,之后和引發(fā)建議之后還有其他建議。 除了周圍的所有建議,都不應(yīng)有返回值。 注釋周圍的內(nèi)容定義了何時(shí)編織建議中的代碼。 當(dāng)我們定義切入點(diǎn)時(shí),也可以做到這一點(diǎn)。 在此示例中,我沒有使用切入點(diǎn)來定義連接點(diǎn),因?yàn)樗呛唵蔚姆矫妗?使用切入點(diǎn)注釋,您可以定義真正的魯棒連接點(diǎn)。 在這種情況下,將在設(shè)置只有一個(gè)String類型參數(shù)的實(shí)體bean的設(shè)置值期間執(zhí)行建議。
在上面的示例中,ProcidingJoinPoint pjp提供了連接點(diǎn),因此在此示例中,它是實(shí)體bean的setter方法。 發(fā)送到實(shí)體設(shè)置器方法的對象的值將首先轉(zhuǎn)換,然后將使用轉(zhuǎn)換后的值調(diào)用設(shè)置器方法。
如果我不使用方面,我的代碼可能看起來像:
我已經(jīng)說過,在此示例中,我使用LTW。 因此,在接下來的幾行中,我將嘗試簡要地解釋編織過程。 編織是其中類以定義的方面進(jìn)行轉(zhuǎn)換的過程。 在下一張圖片中,您可以看到編織過程的圖示。
為了更好地理解編織,在這種情況下,可以將其視為圍繞調(diào)用方法的代碼注入。
結(jié)論
因此,在此示例中,我僅介紹了使用AspectJ進(jìn)行方面編程的一些基本原理。 這方面幫助我保持了代碼的整潔。 使用方面的結(jié)果是跨界代碼與實(shí)際業(yè)務(wù)價(jià)值代碼的清晰分離。 控制器,服務(wù)和實(shí)體bean保持整潔,并且將技術(shù)代碼提取到單獨(dú)的模塊中,使您可以更輕松地理解和維護(hù)代碼。 有關(guān)定義切入點(diǎn)和AspectJ項(xiàng)目常規(guī)的更多詳細(xì)信息,您可以在項(xiàng)目頁面上看到。
祝您編程愉快,別忘了分享!
參考:在Igor Madjeric博客上,我們的JCG合作伙伴 Igor Madjeric 提供了一些方面干凈的代碼 。
翻譯自: https://www.javacodegeeks.com/2012/10/clean-code-with-aspects.html
安卓清理垃圾清理代碼
總結(jié)
以上是生活随笔為你收集整理的安卓清理垃圾清理代码_用方面清理代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在电脑上怎么查看路由器密码是什么如何查看
- 下一篇: 您还在调试吗?