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