Java SpringBoot-在扫描@Component之前注册bean

Java SpringBoot-在扫描@Component之前注册bean,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个依赖于ValidatorService的组件登录。ValidatorService正在登录构造函数中注入/自动连接。ValidationServiceImpl是由一个外部API提供的,所以我不能仅仅将其注释为@Service @Component class Login { @Autowire public Login (ValidatorService validator) { } } @SpringBootApplication public class St

我有一个依赖于ValidatorService的组件登录。ValidatorService正在登录构造函数中注入/自动连接。ValidationServiceImpl是由一个外部API提供的,所以我不能仅仅将其注释为@Service

@Component
class Login {

   @Autowire
   public Login (ValidatorService validator) {

   }
}

@SpringBootApplication
public class Starter {

    public static void main(String[] args)
    {
        SpringApplication.run(Starter.class, args);
    }
}
我正在寻找一种在扫描@Components之前将ValidatorService注册为bean的方法。在启动应用程序之前,是否有方法获取ApplicationContext实例

SpringBoot 2.0.4.0版本

更新

我需要将从mainargs获取的validationId传递给此外部API

public static void main(String[] args) {
    String validationId = args[0];
    ValidatorService service = ExternalValidationAPI.getValidationServiceImp(validationId);
}

我相信通过@Configurable注释,您可以解决您的问题


用@Configurable而不是@Componenet注释登录类,当ValidatorService对象可用时,您可以用它启动登录对象。

您应该能够在一个配置类中将其声明为bean:

@Bean
public ValidatorService validatorService(){
    return new ValidatorServiceImpl();
}
然后,这将在需要时自动连接ValidatorService实现类。此方法需要放在@Configuration类中,您的初学者类就是其中之一


有一个很好的例子说明了如何做到这一点。

您需要定义一个ValidationService bean:

@Configuration
public class ValidationServiceConfig {

    @Bean
    public ValidationService validationService(@Value("${validationId}") String validationId) {
        return new ValidationServiceImpl(validationId);
    }

}
并以这种方式运行程序:java-jar program.jar-validationId=xxx

我解决了创建配置类和声明Bean来处理外部服务的实例化的问题,正如一些人所建议的那样,这些外部服务稍后将被注入。为了检索程序参数,我自动连接了DefaultApplicationArguments以使用getSourceArgs检索程序参数:


你到底为什么要这么做?Spring已经知道bean可以依赖于其他bean,并且它知道如何按顺序创建它们。如果外部API的意思是不能使用注释扫描实现类,如果@Bean方法只有一个构造函数,则可以使用@Bean方法,甚至可以只使用@ImportValidationServiceImpl.class。@chrylis-我唯一拥有的是接口ValidationService和API,它可以根据作为参数传递给此API的validationId检索实例。请查看我关于此ValidationId的更新。您仍然可以从@Bean方法调用ExternalValidationAPI.getValidationServiceImpvalidationId,并将结果作为SpringBean返回。ValidationServiceImpl是否使用任何原型注释进行注释?我已经用一条非常重要的信息更新了我的帖子。有没有办法检索我在这个配置类的Main类中收到的参数?您可以插入JVM参数或程序参数:ValidationServicevalidationService@Value${systemProperties.validationId}字符串validationId或ValidationServicevalidationService@Value${validationId}字符串验证ID如何使用程序参数进行验证?我一从mainargs收到设置为属性的方法,但我觉得这样做不太好:program arg:java-jar program.jar-validationId=xxx,jvm arg java-jar program.jar-DvalidationId=xxxhonestly,这是我第一次看到这种格式-validation=xx
@Configuration
public class ValidatorConfig {

@Autowired
DefaultApplicationArguments applicationArguments;

@Bean
public ValidatorService validatorService()
{
    String validationId = applicationArguments.getSourceArgs()[0];

    return ExternalValidationAPI.getValidationServiceImp(validationId);
}