Java 如何在ProxyFactoryBean上注册没有@Primary注释的ThreadLocalTargetSource

Java 如何在ProxyFactoryBean上注册没有@Primary注释的ThreadLocalTargetSource,java,spring,multithreading,spring-boot,Java,Spring,Multithreading,Spring Boot,在我的应用程序中,我将使用ThreadLocalTargetSource实现审计功能 让我头疼的一件事是,要注册ThreadLocalTargetSource,我必须创建另一个ProxyFactoryBean,其中包含@Primary,如下所示 @Bean(destroyMethod="destroy") public ThreadLocalTargetSource threadLocalAuditLog() { ThreadLocalTargetSource result = new

在我的应用程序中,我将使用
ThreadLocalTargetSource
实现审计功能

让我头疼的一件事是,要注册
ThreadLocalTargetSource
,我必须创建另一个
ProxyFactoryBean
,其中包含
@Primary
,如下所示

@Bean(destroyMethod="destroy")
public ThreadLocalTargetSource threadLocalAuditLog() {
    ThreadLocalTargetSource result = new ThreadLocalTargetSource();
    result.setTargetBeanName("auditLog");

    return result;
}

@Primary
@Bean("proxiedThreadLocalAuditLog")
public ProxyFactoryBean proxiedThreadLocalAuditLog(ThreadLocalTargetSource threadLocalAuditLog) {
    ProxyFactoryBean result = new ProxyFactoryBean();
    result.setTargetSource(threadLocalAuditLog);

    return result;
}
我试图删除
@Primary
,但解决方案不再有效。这应该是我所有项目中的通用代码。因此,如果可能的话,我希望避免使用
@Primary


由于我对ProxyFactoryBean的工作原理没有足够的了解,如果您能向我解释一下为什么这里必须使用
@Primary
,我将不胜感激。如果您能告诉我如何在没有
@Primary
的情况下实现相同的结果,那就太好了。

从教程中判断,您应该使用
请求
范围,而不是使用此解决方案或注册
线程
范围并使其成为
范围
线程。这样,您就不需要
ThreadLocalTargetSource
ProxyFactoryBean
。如果没有
@Primary
,您可以吗?在这种情况下,没有人可以,因为您有两个相同类型的bean,它需要知道使用哪一个。@M.Deinum:关于第一点,我最初使用
@RequestScope
来实现我的审计功能。但是,我有另一个功能需要
@Async
。如果我从
@RequestScope
切换到
ThreadLocalTargetSource
,我的审计功能将按原样工作:)。@M.Deinum:关于第二点,您介意详细说明哪两个bean是同一类型的吗?我担心的是,如果我以后在应用程序的其他地方使用
ProxyFactoryBean
,它将无法工作。但是,在我的代码中没有看到任何其他的
ProxyFactoryBean
ProxyFactoryBean
创建了一个类型为
AuditLog
的bean(或者名为
AuditLog
的bean的任何类型)。因此,或多或少是一个
ProxyFactoryBean
,正如它是一个
FactoryBean
一样,是专门处理的。结果是您有两个类型为
AuditLog
的bean,您需要指定哪个bean是要使用的主要bean(否则您将得到erros,指出有两个bean与预期的1个注入点匹配)。注册
SimpleThreadScope
并使用
@Scope(“线程”)
来代替它要容易得多。destroy方法只在应用程序关闭时调用,而不是在线程结束时调用,其次是请求处理线程未结束或池中使用的线程。基本上,线程作用域和
ThreadLocalTargetSource
遇到了相同的问题。