线程范围的Spring Bean - 它可能吗?

时间:2017-03-01 18:30:10

标签: java spring javabeans

我有一个扩展Thread的类。每个线程都连接到自己的HTTP服务器。

如何配置Spring Bean并为每个线程传递自定义域?

据我所知,Spring支持这样的范围:单例,原型,会话,请求。

1 个答案:

答案 0 :(得分:0)

您可以根据属性注入线程列表。像这样的东西:

线程类。

public class MyThread implements Runnable{

    private String domain; 

    public MyThread(String domain) {
        this.domain = domain;
    }

    @Override
    public void run() {
        System.out.println(domain);
    }

}

属性文件:

t1.domain=www.domain1.com
t2.domain=www.domain2.com

配置类:

@Configuration
@PropertySource(value="classpath:test.properties", name="testProperties")
public class Config {

    @Autowired
    private Environment env;

    @Bean
    public List<MyThread> myThreads(){
        List<MyThread> list = new ArrayList<>();
        for(Iterator it = ((AbstractEnvironment) env).getPropertySources().iterator(); it.hasNext(); ) {
            org.springframework.core.env.PropertySource propertySource = (org.springframework.core.env.PropertySource) it.next();

            if ("testProperties".equals(propertySource.getName())) {
                for(String propertyName : ((MapPropertySource) propertySource).getPropertyNames()){
                    list.add(new MyThread(propertySource.getProperty(propertyName).toString()));
                }
            }
        }
        return list;
    }
}

使用线程的类:

List<MyThread> ll = (List<MyThread>)context.getBean("myThreads");
        for(MyThread t : ll){
            Thread th = new Thread(t);
            th.start();
        }