Java中非常简单的线程

Java中非常简单的线程,java,spring,spring-boot,Java,Spring,Spring Boot,我的Autowire在任何地方都能正常工作,但在我的线程上却不行。我得到这个错误: 说明: threads.EnvironmentThread中的字段dockerService 需要“services.DockerService”类型的bean 那是找不到的 行动: 考虑定义类型为的bean 配置中的“services.DockerService” 我的代码: @SpringBootApplication public class IzyApplication implements Comma

我的Autowire在任何地方都能正常工作,但在我的线程上却不行。我得到这个错误:

说明:

threads.EnvironmentThread中的字段dockerService 需要“services.DockerService”类型的bean 那是找不到的

行动:

考虑定义类型为的bean 配置中的“services.DockerService”

我的代码:

 @SpringBootApplication
public class IzyApplication implements CommandLineRunner{

@Autowired
private DockerService dockerService;

public static void main(String[] args) {
    SpringApplication.run(IzyApplication.class, args);
}


@Override
public void run(String... args) {

    // Call Threads
    ApplicationContext context = new AnnotationConfigApplicationContext(ThreadConfig.class);
    EnvironmentThread environmentThread = (EnvironmentThread) context.getBean("environmentThread");
    environmentThread.setName("Environment Thread");

    //Start Them
    environmentThread.start();
}
}

线程:运行
EnvironmentThread EnvironmentThread=(EnvironmentThread)context.getBean(“EnvironmentThread”)时抛出错误get

线程配置

@Configuration
@ComponentScan(basePackages = {"threads"})
public class ThreadConfig {

}
服务

@Service("dockerService")
public class DockerService {

private static Logger logger;
public DockerClient dockerClient;
@Autowired
private SettingsService settingsService;

// #####################  BUILD CONNECTION WITH DOCKER ####################################
@Singleton
public void buildDockerClient() {

    logger = Logger.getLogger(DockerService.class);

    try {
        //todo remove id
        Settings settings = settingsService.getSettings();
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("tcp://" + settings.getDockerIP() + ":" + settings.getDockerPort())
                .withDockerConfig("/home/user/.docker/config.json")
                .build();

        dockerClient = DockerClientBuilder.getInstance(config).build();

    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
  }

您正在使用
ThreadConfig
中的设置创建应用程序上下文,该设置指定
@ComponentScan(basePackages={“threads”})


DockerService
在包
services
中。该应用程序上下文不知道,因为您没有告诉它扫描该包。

您只能在spring管理的bean中自动连接内容,而启动spring应用程序的bean显然不是其中之一。它与线程无关。请再次查看我的代码。dockerService在SpringBoot应用程序的main.java上工作。但是在环境方面不起作用哦,我明白了,我很困惑。这里的问题是原型作用域,请看这里,您可以修复您的格式,以便“公共类环境线程扩展线程{”也被标记为代码?是的,但是为什么首先要创建一个新的上下文?而且,一个原型范围的bean仍然不会自动连接。@rustyx我没有编写代码,所以我真的不知道创建一个新上下文背后的想法。
EnvironmentThread
是范围化的原型,其他的是默认的单例,所以没有问题将单例自动连接到原型。如果不能自动连接原型bean,那么原型bean会有什么用?他也不是自动连接原型bean,而是通过
getBean()
从应用程序上下文中获取原型bean。
@Service("dockerService")
public class DockerService {

private static Logger logger;
public DockerClient dockerClient;
@Autowired
private SettingsService settingsService;

// #####################  BUILD CONNECTION WITH DOCKER ####################################
@Singleton
public void buildDockerClient() {

    logger = Logger.getLogger(DockerService.class);

    try {
        //todo remove id
        Settings settings = settingsService.getSettings();
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("tcp://" + settings.getDockerIP() + ":" + settings.getDockerPort())
                .withDockerConfig("/home/user/.docker/config.json")
                .build();

        dockerClient = DockerClientBuilder.getInstance(config).build();

    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
  }