Import注記によるbeanインスタンスの動的作成
4621 ワード
詳細
@Import注記によるbeanインスタンスの動的作成には、主に4つの方法があります.
通常javaクラスをインポートし、SpringコンテナにSpring beanとして注入します.
@コンフィギュレーション注記の構成クラスをインポートします.
ImportBeanDefinitionRegistrarインタフェースを実装する実装クラスをインポートします.
ImportSelectorインタフェースを実装する実装クラスをインポートします.
1、一般Javaクラスのインポート
構成クラス:
テストコード:
2、構成クラスのインポート
3.ImportBeanDefinitionRegistrarの実装クラスをインポートする
4、ImportSelectorの実装クラスのインポート
@Import注記によるbeanインスタンスの動的作成には、主に4つの方法があります.
通常javaクラスをインポートし、SpringコンテナにSpring beanとして注入します.
@コンフィギュレーション注記の構成クラスをインポートします.
ImportBeanDefinitionRegistrarインタフェースを実装する実装クラスをインポートします.
ImportSelectorインタフェースを実装する実装クラスをインポートします.
1、一般Javaクラスのインポート
構成クラス:
@Configuration
@Import({Role.class}) // Java
class ImportAnnotationConfig {
}
テストコード:
//AnnotationConfigApplicationContext :Component、Configuration
AnnotationConfigApplicationContext applicationContext
= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);
Role role3 = applicationContext.getBean(Role.class);
System.out.println(role3.getName());
2、構成クラスのインポート
public interface CountryMapper {
void show();
}
class CountryMapperImpl2 implements CountryMapper {
@Override
public void show(){
System.out.println("CountryMapperImpl2.show()");
}
}
@Configuration
class ImportAnnotationConfig2 {
@Bean
public CountryMapper getCountryMapper(){
CountryMapper countryMapper = new CountryMapperImpl2();
return countryMapper;
}
}
@Configuration
@Import({ImportAnnotationConfig2.class}) //
class ImportAnnotationConfig {
@Bean
public User getUser(){
User user = new User();
user.setUsername("uid");
user.setPassword("pwd");
return user;
}
}
//
AnnotationConfigApplicationContext applicationContext
= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);
User user = applicationContext.getBean(User.class);
System.out.println(user.getUsername());
System.out.println(user.getPassword());
CountryMapper countryMapper = applicationContext.getBean(CountryMapper.class);
countryMapper.show();
System.out.println(countryMapper.getUser());
3.ImportBeanDefinitionRegistrarの実装クラスをインポートする
class ImportAnnotationRegistrar implements ImportBeanDefinitionRegistrar{
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
String beanName = "testRole";
if(!registry.containsBeanDefinition(beanName)){
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Role.class);
GenericBeanDefinition beanDefinition = (GenericBeanDefinition)builder.getRawBeanDefinition();
beanDefinition.setBeanClass(Role.class);
beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
// bean
beanDefinition.getPropertyValues().add("name", "Test");
registry.registerBeanDefinition(beanName, beanDefinition);
}
}
}
@Configuration
@Import({ImportAnnotationRegistrar.class}) // ImportBeanDefinitionRegistrar
class ImportAnnotationConfig {
}
//
AnnotationConfigApplicationContext applicationContext
= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);
Role role = applicationContext.getBean("testRole", Role.class);
System.out.println(role.getName());
4、ImportSelectorの実装クラスのインポート
class ImportAnnotationSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// Register 、 、 Java
String[] array = {
ImportAnnotationRegistrar.class.getName(),
ImportAnnotationConfig2.class.getName(),
Role.class.getName()
};
return array;
}
}
@Configuration
@Import({ImportAnnotationSelector.class})
class ImportAnnotationConfig {
}
//
AnnotationConfigApplicationContext applicationContext
= new AnnotationConfigApplicationContext(ImportAnnotationConfig.class);
Role role = applicationContext.getBean("testRole", Role.class);
System.out.println(role.getName());
Role role2 = applicationContext.getBean(Role.class.getName(), Role.class);
System.out.println(role2.getName());
CountryMapper countryMapper = applicationContext.getBean(CountryMapper.class);
countryMapper.show();