Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架中使用特定于线程的数据初始化deepbean_Java_Spring_Initialization_Javabeans - Fatal编程技术网

Java Spring框架中使用特定于线程的数据初始化deepbean

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

Spring的依赖注入机制看起来很方便,因为我不必从根类手动创建类并将它们传递给更深层的类。但是,如果我有3个独立的线程,它们执行相同的任务,并且有一些特定于线程的数据,这些数据应该通过类层次结构进行传播,那该怎么办呢

考虑以下应用程序:

@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