3 回答

TA貢獻1951條經(jīng)驗 獲得超3個贊
對于你需要做的事情,我會說使用攔截器或裝飾器。然而你的攔截器是錯誤的。首先,您缺少基本部分,即對將調(diào)用InvocationContext.proceed()轉(zhuǎn)發(fā)給下一個內(nèi)聯(lián)攔截器(如果有)或方法調(diào)用本身的調(diào)用。其次,您放置在那里的注入點非常具體,只有在攔截這種類型的 bean 時才會對您有所幫助。通常,周圍調(diào)用攔截器方法如下所示:
@AroundInvoke
Object intercept(InvocationContext ctx) throws Exception {
// do something before the invocation of the intercepted method
return ctx.proceed(); // this invoked next interceptor and ultimately the intercepted method
// do something after the invocation of the intercepted method
}
此外,如果您想要有關(guān)攔截哪個 bean 的元數(shù)據(jù)信息,每個攔截器都可以為此注入一個特殊的內(nèi)置 bean。從元數(shù)據(jù)中,您可以收集有關(guān)當(dāng)前正在攔截的 bean 的信息。以下是獲取元數(shù)據(jù)的方法:
@Inject
@Intercepted
private Bean<?> bean;
請注意,攔截器不知道它們攔截的類型,它可以是任何類型,因此您通常需要對普通的進行操作Object。如果您需要更具體的東西,CDI 提供了一個裝飾器模式,它基本上是一個類型感知攔截器。它有一個特殊的注入點(委托),可以讓您直接訪問修飾的 bean。它可能更適合您的場景,請查看CDI 規(guī)范解釋裝飾器的這一部分。

TA貢獻1773條經(jīng)驗 獲得超3個贊
迭代堆棧跟蹤來檢查TopAlbumsHolder
是否存在并不是一個好方法。為了避免在調(diào)用from類
期間調(diào)用攔截器,您可以直接在收集數(shù)據(jù)并將其推送到 中指定調(diào)度程序。您可以采用另一種方式,但您的要點是直接調(diào)用DataAgent bean 內(nèi)的而不參與代理(在這種情況下,攔截器將不適用)。getTopAlbums()
DataAgent
DataAgent
TopAlbumsHolder
getTopAlbums()
PS 請注意,緩存的數(shù)據(jù)應(yīng)該是不可變的(集合及其對象)。

TA貢獻1880條經(jīng)驗 獲得超4個贊
有一個誤會。您不將被攔截的對象注入到攔截器中,而是使用調(diào)用上下文。只需調(diào)用即可invocationContext.proceed()
,無需遞歸。您可以緩存proceed() 的結(jié)果。
添加回答
舉報