第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

字段的Spring Aspect

字段的Spring Aspect

九州編程 2023-05-10 15:12:35
我有一個(gè)要向 InfluxDB 報(bào)告的 bean。數(shù)據(jù)庫(kù)在表中INFLUX_DB_SERVER注冊(cè)了 InfluxDB。如果你看代碼你會(huì)發(fā)現(xiàn) MethodreportMemory做了很多工作,它構(gòu)造了一個(gè) Measurement 并做了 call reportAll,當(dāng)沒(méi)有 InfluxDB 時(shí)所有這些工作都是無(wú)用的。因此,如果沒(méi)有 InfluxDB,我們的想法是跳過(guò)這項(xiàng)工作。由于 public-void-methods 不返回值,因此它對(duì)周圍的應(yīng)用程序沒(méi)有影響。我能做的是我可以編寫一個(gè)方法isWorkPossible并在每次調(diào)用時(shí)調(diào)用該方法。這可能遵循 KISS,但違反了 DRY。所以我喜歡使用 AOP 來(lái)歸檔它。但如果沒(méi)有注冊(cè) InfluxDB,我喜歡跳過(guò)所有 public void 方法的執(zhí)行。/** * The reporter to notify {@link InfluxDB influxDBs} for changes. */@Namedpublic class InfluxDBReporter {    /**     * Logger for reporting. For security reasons neither the username nor the     * password should be logged above {@link Level#FINER}.     */    private static final Logger LOG = Logger.getLogger(InfluxDBReporter.class.getCanonicalName());    /**     * The entitymanager to use, never <code>null</code>.     */    @PersistenceContext    private final EntityManager entityManager = null;    /**     * The registred {@link InfluxDBServer} in key and the URL in value.     */    @SkipPublicVoidMethodsIfEmpty    private final Map<InfluxDB, URL> dbs = new LinkedHashMap<>();    /**     * Initializes the connections.     */    @PostConstruct    private void connect() {        for (InfluxDBServer db : FROM(囗InfluxDBServer.class).all(entityManager)) {            try {                URL dbUrl = new URL(db.getUrl());                InfluxDB idb = InfluxDBFactory.connect(db.getUrl(), db.getUsername(), db.getPassword());                idb.setDatabase(db.getDatabaseName());                dbs.put(idb, dbUrl);            } catch (MalformedURLException e) {                LOG.log(Level.SEVERE, db.getUrl(), e);            }        }    }我希望System.out.println在實(shí)例化 bean 時(shí)運(yùn)行,但它沒(méi)有。知道為什么嗎?
查看完整描述

1 回答

?
12345678_0001

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í)。


查看完整回答
反對(duì) 回復(fù) 2023-05-10
  • 1 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)