修飾子を持っています
public class TestController{
@Autowired
@Qualifier("jdbc")
private JdbcTemplate jtm;
//.....
}
修飾子「jdbc」は、次のように定義されたBeanです。
@Bean(name = "jdbc")
@Autowired
public JdbcTemplate masterJdbcTemplate(@Qualifier("prod") DataSource prod) {
return new JdbcTemplate(prod);
}
これは、その修飾子のデータソースを返し、正常に動作します。
次に、修飾子名をapplication.propertiesから読み取るようにします。だから私は私のコードを
public class TestController{
@Autowired
@Qualifier("${database.connector.name}")
private JdbcTemplate jtm;
//.....
}
どこ database.connector.name=jdbc
私のapplication.properties内。
しかし、これを行うと、これはエラーをスローします
アプリケーションを開始できませんでした
説明:
Main.Java.rest.TestControllerのフィールドuserServiceには、見つからないタイプ「org.springframework.jdbc.core.JdbcTemplate」のBeanが必要でした。
アクション:
構成で 'org.springframework.jdbc.core.JdbcTemplate'タイプのBeanを定義することを検討してください。
どんな助けでもありがたいです。
修飾子はプレースホルダーを解決しません。 TestController
クラスは次のように書くことができます
public class TestController {
@Value("${database.connector.name}")
private String name;
private JdbcTemplate jtm;
@Autowired
public void setJdbcTemplate(ApplicationContext context) {
jtm = (JdbcTemplate) context.getBean(name);
}
}
@Hemantがすでに述べたように、デフォルトのQualifierCandidateResolver
はプロパティを解決しません。
しかし、あなたはそれを作ることができます:
_import Java.lang.annotation.Annotation;
import org.springframework.beans.TypeConverter;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.stereotype.Component;
@Component
public static class AutowireCandidateResolverConfigurer implements BeanFactoryPostProcessor {
private static class EnvironmentAwareQualifierAnnotationAutowireCandidateResolver extends QualifierAnnotationAutowireCandidateResolver {
private static class ResolvedQualifier implements Qualifier {
private final String value;
ResolvedQualifier(String value) { this.value = value; }
@Override
public String value() { return this.value; }
@Override
public Class<? extends Annotation> annotationType() { return Qualifier.class; }
}
@Override
protected boolean checkQualifier(BeanDefinitionHolder bdHolder, Annotation annotation, TypeConverter typeConverter) {
if (annotation instanceof Qualifier) {
Qualifier qualifier = (Qualifier) annotation;
if (qualifier.value().startsWith("${") && qualifier.value().endsWith("}")) {
DefaultListableBeanFactory bf = (DefaultListableBeanFactory) this.getBeanFactory();
ResolvedQualifier resolvedQualifier = new ResolvedQualifier(bf.resolveEmbeddedValue(qualifier.value()));
return super.checkQualifier(bdHolder, resolvedQualifier, typeConverter);
}
}
return super.checkQualifier(bdHolder, annotation, typeConverter);
}
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
DefaultListableBeanFactory bf = (DefaultListableBeanFactory) beanFactory;
bf.setAutowireCandidateResolver(new EnvironmentAwareQualifierAnnotationAutowireCandidateResolver());
}
}
_
これで、_@Qualifier
_をあなたが尋ねた方法で使用できるようになります@Qualifier("${database.connector.name}")
完全な例:
_@SpringBootApplication
public class SO50208018Application {
public static void main(String[] args) { SpringApplication.run(SO50208018Application.class, args); }
interface MyBean { }
static class MyBeanImpl1 implements MyBean { }
static class MyBeanImpl2 implements MyBean { }
@Bean @Qualifier("impl1")
MyBean bean1() { return new MyBeanImpl1(); }
@Bean @Qualifier("impl2")
MyBean bean2() { return new MyBeanImpl2(); }
@Component
public static class AutowireCandidateResolverConfigurer implements BeanFactoryPostProcessor {
// configurer from above
}
@Bean
CommandLineRunner run(@Qualifier("${spring.application.bean}") MyBean bean) {
return (args) -> System.out.println(bean.getClass().getName());
}
}
_
_spring.application.bean=impl1
_で実行:
_com.stackoverflow.Java.SO50208018Application$MyBeanImpl1
_
_spring.application.bean=impl2
_で実行:
_com.stackoverflow.Java.SO50208018Application$MyBeanImpl2
_
@Qualifier("jdbc")
を保持する場合、さまざまなテスト構成ファイルを提供し、各テストクラスに必要なファイルをロードすることにより、注入されるBeanを変更できます。