Java中非常简单的线程
我的Autowire在任何地方都能正常工作,但在我的线程上却不行。我得到这个错误: 说明: threads.EnvironmentThread中的字段dockerService 需要“services.DockerService”类型的bean 那是找不到的 行动: 考虑定义类型为的bean 配置中的“services.DockerService” 我的代码: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
@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);
}
}