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

Java 如何为ProxyFactoryBean设置多个目标?,java,interceptor,spring-aop,spring-4,aspect,Java,Interceptor,Spring Aop,Spring 4,Aspect,我正在使用Spring 4 AOP,现在我的ProxyFactoryBean配置如下: @Bean @Primary public ProxyFactoryBean proxyFactoryBean() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(new ClientService()); proxyFactoryBean.addAdvic

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


是否可以设定多个目标而不是一个?如果可能的话,我想把这些建议纳入整个方案。否则,设定具体的目标,但同样,不只是一个。你怎么能这么做?提前感谢

在面向方面的语言中使用切入点可以实现您想要实现的目标。因此,您可以定义切入点,以便将方面自动应用于多个目标(例如实现同一接口)。查看更多详细信息(滚动至9.2.3声明切入点)。

使用Spring的代理最容易在应用程序上下文中代理所有符合特定条件的bean。唉,在基于java的配置中使用切入点api有些麻烦;我通常将子类化,以便用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();
}
@Bean
AbstractAutoProxyCreator autoProxyCreator(){
返回新的AbstractAutoProxyCreator(){
@凌驾
受保护对象[]GetAdvicesandAdvisorForBean(类beanClass、字符串beanName、TargetSource customTargetSource){
if(BusinessService.class.isAssignableFrom(beanClass)){
返回新对象[]{loggingAdvice()};
}否则{
返回“不使用代理”;
}
}
};
}
@豆子
LoggingAdvice LoggingAdvice(){
返回新的日志通知();
}
@豆子
公共人员服务{
返回新的PersonService();
}

这段代码未经测试,因为我手头没有带Spring(或Maven)的IDE,但要点应该可以使用。

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

为此,您需要

  • 使用@Component和@Aspect注释创建“Aspect”类
  • 使用@Pointcut annotation在方面内创建“Pointcut”定义, 下面是一个例子
  • 创建“建议”-围绕、之前、之后、之后返回并提供 适当的建议和执行
  • 在服务器上使用@enableSpectProxy启用AspectJ配置 如果要使用CGLIB代理,请使用“proxyTargetClass=true”的配置类
  • 并确保aspect类位于扫描路径上
  • e、 g


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

    谢谢!我会试试的
    @Pointcut(within(*..*Service))
    public void allService(){}