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
遇到了相同的问题。