2012-04-03 42 views
1

請考慮以下事項:我們有一個春豆B,建議使用多個方面:A1,A2。我們還有一些其他的春豆:X,Y,Z - 和B被注入到它們全部。問題是:我們如何根據調用B的bean(X,Y,Y,Z)來使B的方面適用?在我的特定任務中,我需要在從特定Bean(例如,Z)調用B時繞過一個方面(例如,A2),而在其他調用中,必須應用所有方面。根據建議的對象調用位置應用方面

回答

1

這個決定很簡單。 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參考是可以使用的。