将单个@Component实例转换为多个实例的最佳方法是什么?

时间:2018-07-17 17:58:58

标签: java spring

我有一个Spring应用程序,该应用程序创建一个计划和运行Runnable的任务:

主要:

@SpringBootApplication
@Slf4j
@Configuration
@EnableEncryptableProperties
@EnableJpaAuditing
public class Main {
    @Autowired
    CoinListerTask coinListerTask;

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


    @Component
    public class CommandLineAppStartupRunner implements CommandLineRunner {
        @Override
        public void run(String...args) throws Exception {
            ... 

            // start coin listing job           
            coinListerTask.startup();

任务:

@Component
public class CoinListerTask {
    private TimeUnit timeUnit = TimeUnit.SECONDS;
    private String threadName = "coin-lister";

    @Value("${coindatabase.coinlister.initialDelay}")
    private long initalDelay;

    @Value("${coindatabase.coinlister.period}")
    private long period;

    private String exchangeNameString = "Cryptopia";

    @Autowired
    private IDataService dataService;

    @Autowired
    CoinDbService dbService;

    public void startup() {
        ScheduledExecutorService executorService = new WrappedScheduledExecutor(threadName, 1, false);
        executorService.scheduleAtFixedRate(runnableTask, initalDelay, period, timeUnit);   

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                Shutdown.runner(executorService, threadName, 60L);
            }
        });
    }

    Runnable runnableTask = () -> {
            // do stuff...
    }

这按原样可以正常工作,但是我现在想将其概括化,这样我就可以运行任务的多个实例,这些实例具有通过application.properties指定的不同参数集来替换当前自动装配的变量。

我应该删除@Component并将所有内容传递给使用new创建的实例,还是有一种更好的,更适合春季的方法来实现这一点?

解决方案

要扩展Lino和Visal的解决方案,请执行以下操作:

  1. 添加到组件: @Scope(“ prototype”)

  2. 将组件的@Autowire替换为: @Autowired 提供者coinListerTaskProvider;

  3. 将任务的调用更改为: coinListerTaskProvider.get()。startup();

可以通过添加javax / javaee-api / 6.0来使用提供程序

1 个答案:

答案 0 :(得分:1)

如果您想在每次调用时创建一个新实例,请将Scope注释与组件,服务,控制器,存储库等配合使用:-

@Component
@Scope("prototype")

原型定义作用域的地方,即每次调用时总是给出一个新实例。

请参见范围的javadoc