Java Spring框架中使用特定于线程的数据初始化deepbean
Spring的依赖注入机制看起来很方便,因为我不必从根类手动创建类并将它们传递给更深层的类。但是,如果我有3个独立的线程,它们执行相同的任务,并且有一些特定于线程的数据,这些数据应该通过类层次结构进行传播,那该怎么办呢 考虑以下应用程序:Java Spring框架中使用特定于线程的数据初始化deepbean,java,spring,initialization,javabeans,Java,Spring,Initialization,Javabeans,Spring的依赖注入机制看起来很方便,因为我不必从根类手动创建类并将它们传递给更深层的类。但是,如果我有3个独立的线程,它们执行相同的任务,并且有一些特定于线程的数据,这些数据应该通过类层次结构进行传播,那该怎么办呢 考虑以下应用程序: @SpringBootApplication public class App { public static void main(String[] args) throws IOException { Properties prop
@SpringBootApplication
public class App {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
props.load(App.class.getResourceAsStream("/application.properties"));
String[] domains = props.getProperty("domains").split(",");
ConfigurableApplicationContext context = SpringApplication.run(App.class);
ConfigurableListableBeanFactory factory = context.getBeanFactory();
for(String domain : domains) {
DomainListener listener = factory.getBean(DomainListener.class);
listener.setDomain(domain);
listener.start();
}
}
}
@Service
@Scope("prototype")
public class DomainListener extends Thread {
@Autowired
EventPublisher publisher;
String domain;
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public void run() {
System.out.println("starting '" + domain + "' domain thread...");
publisher.setDomain(domain); // <-- is this the best way to initialize bean?
// some processing
publisher.publish("Some event");
}
}
@Component
@Scope("prototype")
public class EventPublisher {
String domain;
public void setDomain(String domain) {
this.domain = domain;
}
public void publish(String msg) {
System.out.println("publishing '" + msg + "' to '" + domain + "' domain");
}
}
DomainListener
和EventPublisher
类不能由Spring自动用domain
值初始化,因此我必须调用setDomain
方法并手动传递域值,首先在DomainListener
线程构造期间,然后在DomainListener.run()中
使用域值初始化EventPublisher
。如果我需要更深入地传递值,例如从EventPublisher
传递到其他类,比如MessageBuilder
(假设它需要域值),那么我必须从EventPublisher
构造函数调用MessageBuilder.setDomain()
实例方法(因为它是同一个域线程)
这有什么改进吗?只需将它们定义为
@Bean
方法。。。或者创建一个工厂。好吧,假设我有一个带有@Bean
注释方法的@Configuration
类。在该方法中,我可以使用一些数据初始化bean。但我如何向该方法传递,例如,domain
值?我如何知道正在构造的bean将返回到哪个线程?为什么不传递这些东西,这就是方法参数的用途,或者将其放在本地线程中。但出于某种原因,你似乎在尝试使用错误的方法来解决这个问题。是的,对我来说,这也是一个错误的方法(我已经描述过的方法)。这就是我问这个问题的原因。正如我所解释的,根据配置文件中指定的域,可以有多个线程。每个域都由后端上的相同服务提供服务。实际上,服务为每个域执行相同的工作,但每个域都有自己的上下文。我正在建立另一个必须与服务合作的服务。顺便说一句,ThreadLocal是一个很好的建议。非常感谢。
domains = domain1.example.com,domain2.example.com,domain3.example.com