我有一个取决于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
答案 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);
}