根据建议的对象调用位置应用方面

时间:2012-04-03 16:45:52

标签: java spring aop spring-aop

请考虑以下事项:我们有一个Spring bean B,其建议涉及多个方面:A1A2。我们还有一些其他的Spring bean:XYZ - 并且B被注入所有这些bean。问题是:我们如何根据调用B的bean BXY来应用Z的方面? )?在我的特定任务中,我需要在从特定bean(例如,A2)调用B时绕过一个方面(例如,Z),而在其他调用中必须应用方面。

1 个答案:

答案 0 :(得分: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引用了。