我已经看到了很多关于我试图用BeanDefinitionRegistryPostProcessor做什么的变通方法,但我想知道是否有一种方法可以直接使用Spring的bean创建API来覆盖某些行为.

我想看到的是这样的东西(注意@Components中的"s"):

@Components(prefix="myBean-", numberOfInstances="${myapp.mybean.numberOfInstances}")
public class MyBean {

  private final MyService myService;

  public MyBean(final MyService myService) {
    this.myService = myService;
  }

  @Scheduled(fixedDelayString = "${myapp.mybean.fixedDelay}")
  public myJob() {
    System.out.println("I'm working!");
  }
}

我基本上是在寻找与@Component相同的功能,在这里我可以指定创建多少个实例,并生成名称.

正如我之前提到的,我发现做这类事情的唯一方法(特别是现在的计划任务)是使用BeanDefinitionRegistryPostProcessor来创建实例,或者创建一个自定义SchedulingConfigurer来手动配置任务,而不使用Spring beans,这意味着Runnable的所有依赖项都必须连接到SchedulingConfigurer中,这让人感觉脏兮兮的.

这是否可能——添加一个新注释来扫描并调用其他方法来创建bean?

使现代化

感谢@vince帮助我意识到我不需要每一份工作都有一粒分离豆;我只需要在FixedDelayTask中多次配置singleton.

@Component
public class MyBean {

  private final MyService myService;

  public MyBean(final MyService myService) {
    this.myService = myService;
  }

  // Remove @Scheduled here since we have to configure multiple
  // instances manually. This is where it would be nice to specify
  // how many jobs of the same type you want.
  // @Scheduled(fixedDelayString = "${myapp.mybean.fixedDelay}")
  public myJob() {
    System.out.println("I'm working!");
  }
}

@Configuration
@EnableScheduling
public class MyBeanTaskConfiguration implements SchedulingConfigurer {

  private final MyBean myBean;

  public MyBeanTaskConfiguration(MyBean myBean) {
    this.myBean = myBean;
  }

  @Override
  public void configureTasks(final ScheduledTaskRegistrar taskRegistrar) {
    for (int i = 0; i < numberOfWorkers; i++) {
      taskRegistrar.scheduleFixedDelayTask(
              new FixedDelayTask(
                      myBean,
                      repeatIntervalMs,
                      repeatIntervalMs / numberOfWorkers * i + startDelayMs
              )
      );
    }
  }

}

推荐答案

其实我想知道你为什么要这么做.根据国际奥委会的理念,bean应该委托给容器,客户不需要关心bean的生命周期.这就是为什么Spring提供@Scope来支持不同的bean作用域,比如singleton/request/session.所以我认为控制特定bean的具体数量不是一个好方法,而且,bean理论上应该是非状态的,因此一个实例就足够了.

Java相关问答推荐

Java加密/解密代码转换为PHP不起作用

基于仅存在于父级中的字段查询子文档?

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

如何在返回bigint []值的子查询中使用any?

工件部署期间出错[Tomcat 8.5.45]

使用动态ID从json获取详细信息的Jolt规范

对某一Hyroby控制器禁用@cacheable

如何创建同一类的另一个对象,该对象位于变量中?

CompleteableFuture是否运行在不同的内核上?

无法了解Java线程所消耗的时间

Java:使用Class.cast()将对象转换为原始数组

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

Java中将文本拆分为数字或十进制数字和字符串

GetChildren().emoveAll()不会删除 node

Java连接池无法正常工作

如何使用log4j2(Json)记录由";异常引起的所有";?

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

OAuth:登录后无法查看Google邮箱地址