私が言ったように、私の問題の解決策が見つかりました。 hereを述べたように - - 以下のようになり、コンテンツのファイルMETA-INF/spring.factories
を追加することにより、
まず我々はSpring Boot
によってロードされた自動構成クラスが必要です。この自動構成では、レジストラがロードされ、コンポーネントプロバイダを介して@Retrofit
という注釈付きクラスを検索します。最後に、レジストラは、このファクトリBeanがRetrofitプロキシ自体を作成している間に見つかる可能性があるインスタンスごとにRetrofitFactoryBean
というインスタンスを作成します。
自動設定
@Configuration
@Import(RetrofitRegistrar.class)
public class RetrofitAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public Retrofit retrofit() {
return new Retrofit.Builder().build();
}
}
META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
spring.retrofit.RetrofitAutoConfiguration
インポートレジストラ
public class RetrofitRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
@Setter
private BeanFactory beanFactory;
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
List<String> basePackages = AutoConfigurationPackages.get(this.beanFactory);
RetrofitComponentProvider provider = new RetrofitComponentProvider(registry);
basePackages.stream()
.map(provider::findCandidateComponents)
.flatMap(Set::stream)
.forEach(comp -> register(comp, registry));
}
private void register(BeanDefinition component, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.
rootBeanDefinition(RetrofitFactoryBean.class);
builder.addConstructorArgValue(component.getBeanClassName());
registry.registerBeanDefinition(
component.getBeanClassName().toLowerCase(), builder.getBeanDefinition());
}
}
コンポーネントプロバイダ
class RetrofitComponentProvider extends ClassPathScanningCandidateComponentProvider {
@Getter
private BeanDefinitionRegistry registry;
public RetrofitComponentProvider(BeanDefinitionRegistry registry) {
super(false);
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
this.registry = registry;
addIncludeFilter(new AnnotationTypeFilter(Retrofit.class, true, true));
}
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return true;
}
}
工場豆
@Component
@RequiredArgsConstructor
public class RetrofitFactoryBean extends AbstractFactoryBean<Object> {
@Getter
private final Class<?> objectType;
private final retrofit2.Retrofit retrofit;
@Override
protected Object createInstance() throws Exception {
return retrofit.create(objectType);
}
}
@Getter
、@Setter
と@RequiredArgsConstructor
注釈がProjectLombok
によって提供されているが、あなたはそれをautowireしてみましたか?もしあれば、コードとエラーがあればそれを置いてください。 – MrMisery
例を追加しましたが、明らかに動作しません。特定のインタフェースのインスタンスが見つからないためです。エラーは 'com.example.TestApplicationのフィールドapiは 'com.example型のBeanを必要としました。Api 'を見つけることができませんでした。 –