Import注記によるbeanインスタンスの動的作成

4621 ワード

詳細
@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();