Reputation: 429
I have a simple Spring application AppMain
with autowiring where I'd like not to use any explicit XML configuration.
In my TaskScheduler
component I'd like to wire ThreadPoolTaskExecutor
object to taskExecutor
field that is of super-class type. Its something that is straightforward in Spring with XML.
But is it possible with autowiring and pure annotation based config? How to do that?
AppMain
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class AppMain {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(AppMain.class);
app.run(args);
}
}
TaskScheduler
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
@Component
public class TaskScheduler {
@Autowired
private final TaskExecutor taskExecutor;
@Scheduled(fixedDelay = 1000)
public void checkConfiguration() {
// TODO: do some business with task executor (expecting it to be ThreadPoolTaskExecutor in runtime)
}
}
Upvotes: 0
Views: 382
Reputation: 2479
If I get your question correctly, you need a specific implementation (ThreadPoolTaskExecutor
) when you need wiring for TaskExecutor
.
In that case you need to create a configuration class with a spring bean inside that builds the ThreadPoolTaskExecutor and then import the configuration in your main application.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class AppConfiguration {
@Bean
public TaskExecutor taskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
And then modify your main class like so :
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@Import(AppConfiguration.class)
public class AppMain {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(AppMain.class);
app.run(args);
}
}
Upvotes: 1