alwi
alwi

Reputation: 429

Wiring specific subclass of particular component field type (@SpringBootApplication and @Autowire)

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

Answers (1)

Nick Tsitlakidis
Nick Tsitlakidis

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

Related Questions