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

时间:2019-03-05 22:30:14

标签: java spring spring-boot

我有一个取决于ValidatorService的组件Login。 ValidatorService将在Login构造函数中注入/自动装配。 ValidationServiceImpl由外部API提供,所以我不能仅将其注释为@Service。

*(someUnion.someArray+i)

我正在寻找一种方法,可以在扫描@Components之前将ValidatorService注册为bean。有没有办法在启动应用程序之前获取ApplicationContext实例?

SpringBoot 2.0.4.RELEASE

更新

我需要将要从main(args)获取的validationId传递给此外部API。

someUnion.intMember

4 个答案:

答案 0 :(得分:4)

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

@Bean
public ValidatorService validatorService(){
    return new ValidatorServiceImpl();
}

然后将在需要的地方自动装配ValidatorService实现类。此方法需要进入@Configuration类(您的Starter类是一个)。

有一个很好的示例here

答案 1 :(得分:1)

我相信您可以借助@Configurable注释解决问题。

使用@Configurable而不是@Componenet注释Login类,并且当ValidatorService对象可用时,可以使用它来初始化Login对象。

答案 2 :(得分:1)

您需要定义ValidationService bean:

@Configuration
public class ValidationServiceConfig {

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

}

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

答案 3 :(得分:0)

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

@Configuration
public class ValidatorConfig {

@Autowired
DefaultApplicationArguments applicationArguments;

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

    return ExternalValidationAPI.getValidationServiceImp(validationId);
}