1
請考慮以下事項:我們有一個春豆B
,建議使用多個方面:A1
,A2
。我們還有一些其他的春豆:X
,Y
,Z
- 和B
被注入到它們全部。問題是:我們如何根據調用B
的bean(X
,Y
,Y
,Z
)來使B
的方面適用?在我的特定任務中,我需要在從特定Bean(例如,Z
)調用B
時繞過一個方面(例如,A2
),而在其他調用中,必須應用所有方面。根據建議的對象調用位置應用方面
請考慮以下事項:我們有一個春豆B
,建議使用多個方面:A1
,A2
。我們還有一些其他的春豆:X
,Y
,Z
- 和B
被注入到它們全部。問題是:我們如何根據調用B
的bean(X
,Y
,Y
,Z
)來使B
的方面適用?在我的特定任務中,我需要在從特定Bean(例如,Z
)調用B
時繞過一個方面(例如,A2
),而在其他調用中,必須應用所有方面。根據建議的對象調用位置應用方面
這個決定很簡單。 Z
包含對B
的引用,並且該引用是Advised
的類型。該接口允許訪問建議對象的不同屬性,包括其方面。這允許創建新的建議對象,其僅包括B
的所需方面。代碼片段如下。
所有類型和標識符都是以原始問題爲例給出的。 B
是ab接口,b
是一個參考。代碼片段來自Z
bean。
Class<?>[] classes = {B.class};
AdvisedSupport config = new AdvisedSupport(classes);
try {
config.setTargetSource(((Advised) b).getTargetSource());
} catch (Exception e) {
e.printStackTrace();
}
for (Advisor advisor : ((Advised) b).getAdvisors()) {
Advice advice = advisor.getAdvice();
if ((advice instanceof AbstractAspectJAdvice) && "advice.A2".equals(
((AbstractAspectJAdvice) advice).getAspectName())) {
// Do not add A2 advisor
} else {
config.addAdvisor(advisor);
}
}
DefaultAopProxyFactory factory = new DefaultAopProxyFactory();
B newB = (B)factory.createAopProxy(config).getProxy();
現在newB
參考是可以使用的。