1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
正如JB Nizet已經(jīng)說(shuō)過(guò)的那樣,@annotation(my.package.MyAnnotation)
它旨在捕獲方法上的注釋,而不是字段上的注釋,這解釋了為什么您對(duì)任何事情發(fā)生的期望都是錯(cuò)誤的。
如果你想通過(guò) AOP 找出一個(gè)類是否有一個(gè)帶有特定注釋的成員,你需要使用一個(gè)特殊的切入點(diǎn),比如hasfield(@MyAnnotation * *)
.?但是這個(gè)切入點(diǎn)在 Spring AOP 中不可用,你需要切換到 AspectJ。get(@MyAnnotation MyType *)
如果您想通過(guò)或攔截對(duì)此類字段的讀/寫訪問(wèn),也是如此set(@MyAnnotation MyType *)
。
AspectJ 還提供了特殊的切入點(diǎn)
在類加載后攔截類的靜態(tài)初始化 - >
staticinitialization()
攔截構(gòu)造函數(shù)執(zhí)行->
MyType.new()
只要是合適的時(shí)間,您就可以使用它們來(lái)執(zhí)行您的方面建議。@PostConstruct
在您的示例中,如果很明顯所有目標(biāo)類都有其中一個(gè),您還可以更輕松地掛接到方法中。
我的回答很籠統(tǒng),因?yàn)槟銢](méi)有詳細(xì)解釋你到底想做什么。所以請(qǐng)隨時(shí)提出后續(xù)問(wèn)題。
更新:我檢查了你最新的問(wèn)題更新。我不明白,這是針對(duì)一個(gè)非常簡(jiǎn)單的問(wèn)題的非常人為的解決方案,也不是 AOP 解決的好案例。盡管我很喜歡 AOP,但我看不出這種情況是一個(gè)橫切關(guān)注點(diǎn):
它似乎只影響一個(gè)類,
InfluxDBReporter
.您正在使用一個(gè)注釋,該注釋的存在唯一目的是告訴一個(gè)方面要做什么。
更糟糕的是,您將注釋放在私有字段上,但期望外部類(在本例中為方面)對(duì)其作出反應(yīng)。雖然這在技術(shù)上使用 AspectJ 是可行的,但它是糟糕的設(shè)計(jì),因?yàn)槟鷮⑺接行畔⑿孤┑酵獠俊?/p>
通過(guò)從您的示例類中跳過(guò)公共方法,您不會(huì)保存任何昂貴的與數(shù)據(jù)庫(kù)相關(guān)的操作,因?yàn)榈粋€(gè)空
KeySet
意味著什么都不會(huì)發(fā)生,因此也不會(huì)有任何與數(shù)據(jù)庫(kù)相關(guān)的錯(cuò)誤。這里唯一真正發(fā)生的是構(gòu)建器調(diào)用。它們應(yīng)該很便宜。
即使假設(shè)你有更多應(yīng)該跳過(guò)的公共方法,如果你確實(shí)想堅(jiān)持使用這種方法,我實(shí)際上會(huì)設(shè)計(jì)這樣的 AOP 解決方案:
向您的應(yīng)用程序類添加一個(gè)方法
public boolean isConnectedToDB() { return !dbs.isEmpty(); }
。在您方面,使用
@Around
建議并從那里調(diào)用布爾方法,僅joinPoint.proceed()
在有任何連接時(shí)才調(diào)用。否則不要繼續(xù),而是什么也不做(對(duì)于void
方法)或返回一個(gè)虛擬結(jié)果null
(對(duì)于非void
方法)。
確切的解決方案取決于您是否只有這個(gè)類或多個(gè)具有類似要求的類,如果您只有public void
方法或非空方法。
此外,您提到INFLUX_DB_SERVER
但我不知道這是什么,因?yàn)槲以谀拇a中的任何地方都看不到它。
最后但并非最不重要的一點(diǎn)是:我剛剛注意到您希望在 . 注釋的方法中發(fā)生某些事情@Pointcut
。抱歉,即使切入點(diǎn)沒(méi)有錯(cuò),那里也會(huì)發(fā)生一些事情,因?yàn)榍腥朦c(diǎn)定義只是用于實(shí)際的建議方法,例如@Before
,?@After
,?@Around
。您想要執(zhí)行的操作進(jìn)入通知,而不是進(jìn)入切入點(diǎn)。我建議您在嘗試設(shè)計(jì)基于 AOP 的解決方案之前先學(xué)習(xí) AOP 基礎(chǔ)知識(shí)。
添加回答
舉報(bào)