如何将多个目标设置为ProxyFactoryBean?

问题描述 投票:0回答:3

我正在使用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对象。

是否可以设置多个目标而不仅仅是一个?如果可能的话,我想将这些建议设置为整个包。否则,设置特定目标,但不仅仅是一个。你怎么能做到这一点 ?提前致谢

java interceptor spring-aop spring-4 aspect
3个回答
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,但要点应该有效。


1
投票

您尝试实现的目标可以通过在面向方面的语言中使用切入点来完成。因此,您可以定义切点以自动将方面应用于多个目标,例如实现相同的接口。查看更多详细信息here(滚动到9.2.3声明切入点)。


0
投票

最简单的方法是使用AspectJ注释 - 在()表达式中使用

为此你需要

  1. 使用@Component和@Aspect注释创建“Aspect”类
  2. 使用@Pointcut注释在方面内创建“切入点”定义,示例如下所述
  3. 创建“建议” - 围绕,之前,之后,后退,并提供适当的建议实施
  4. 如果要使用CGLIB代理,请使用配置类中的@EnableAspectJAutoProxy启用AspectJ配置,并使用'proxyTargetClass = true'
  5. 并确保您的方面类位于扫描路径上

EG

@Pointcut(within(*..*Service))
public void allService(){}

上面的()表达式将匹配所有以'Service'结尾的类,您也可以匹配特定包中的所有类。

© www.soinside.com 2019 - 2024. All rights reserved.