我正在使用Spring 4 AOP,现在,我的ProxyFactoryBean配置如下:
@Bean
@Primary
public ProxyFactoryBean proxyFactoryBean() {
ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.setTarget(new ClientService());
proxyFactoryBean.addAdvice(new LoggingAdvice());
proxyFactoryBean.addAdvice(new DebugInterceptor());
return proxyFactoryBean;
}
这样可行,但目标只是ClientService对象。
是否可以设置多个目标而不仅仅是一个?如果可能的话,我想将这些建议设置为整个包。否则,设置特定目标,但不仅仅是一个。你怎么能做到这一点 ?提前致谢
答案 0 :(得分:1)
您尝试实现的目标可以通过在面向方面的语言中使用缩减来实现。因此,您可以定义切点以自动将方面应用于多个目标,例如实现相同的接口。查看更多详情here(滚动到9.2.3声明切入点)。
答案 1 :(得分:1)
使用Spring AutoProxy-Facility最简单地使用符合特定条件的应用程序上下文中的所有bean进行代理。唉,切入点api在基于java的配置中使用起来有些麻烦;我通常是AbstractAutoProxyCreator的子类,所以我可以在java代码中表达切入点。
例如,我做了类似的事情:
@Bean
AbstractAutoProxyCreator autoProxyCreator() {
return new AbstractAutoProxyCreator() {
@Override
protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource customTargetSource) {
if (BusinessService.class.isAssignableFrom(beanClass)) {
return new Object[] {loggingAdvice()};
} else {
return DO_NOT_PROXY;
}
}
};
}
@Bean
LoggingAdvice loggingAdvice() {
return new LoggingAdvice();
}
@Bean
public PersonService personService() {
return new PersonService();
}
此代码未经测试,因为我手边没有带Spring(或Maven)的IDE,但要点应该有效。
答案 2 :(得分:0)
最简单的方法是使用AspectJ注释-使用inside()表达式
为此,您将需要
例如
@Pointcut(within(*..*Service))
public void allService(){}
inside()表达式上方将匹配所有以'Service'结尾的类,您也可以匹配特定程序包中的所有类。