導入bean的幾種方式

導入bean的幾種方式

配置類

/**
* 給容器中註冊組件;
* 1)、包掃描+組件標註註解(@Controller/@Service/@Repository/@Component)[本身寫的類]
* 2)、@Bean[導入的第三方包裏面的組件]
* 3)、@Import[快速給容器中導入一個組件]
* 		1)、@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名
* 		2)、ImportSelector:實現接口,返回須要導入的組件的全類名數組;
* 		3)、ImportBeanDefinitionRegistrar:實現接口,手動註冊bean到容器中
* 4)、使用Spring提供的 FactoryBean(工廠Bean);
*/
@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
	/**
	* 使用Spring提供的 FactoryBean(工廠Bean);
	* 	1)、默認獲取到的是工廠bean調用getObject建立的對象
	* 	2)、要獲取工廠Bean自己,咱們須要給id前面加一個&
	* 		&colorFactoryBean
	*/
	@Bean
	public ColorFactoryBean colorFactoryBean(){
		return new ColorFactoryBean();
	}
}

ImportSelector接口方式

//自定義邏輯返回須要導入的組件
public class MyImportSelector implements ImportSelector {
	//返回值,就是到導入到容器中的組件全類名
	//AnnotationMetadata:當前標註@Import註解的類的全部註解信息
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		//importingClassMetadata
		//方法不要返回null值
		return new String[]{"cn.bootx.Red","cn.bootx.Yellow"};
	}

}

ImportBeanDefinitionRegistrar接口方式

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	/**
	 * AnnotationMetadata:當前類的註解信息
	 * BeanDefinitionRegistry:BeanDefinition註冊類;
	 * 		把全部須要添加到容器中的bean;調用
	 * 		BeanDefinitionRegistry.registerBeanDefinition手工註冊進來
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		//判斷容器中是否有指定ID的bean
		boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
		boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
		if(definition && definition2){
			//指定Bean定義信息;(Bean的類型,Bean。。。)
			RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
			//註冊一個Bean,指定bean名
			registry.registerBeanDefinition("rainBow", beanDefinition);
		}
	}

}

工廠Bean方式

//建立一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

	//返回一個Color對象,這個對象會添加到容器中
	@Override
	public Color getObject() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("ColorFactoryBean...getObject...");
		return new Color();
	}
	//返回對象的class類型
	@Override
	public Class<?> getObjectType() {
		return Color.class;
	}

	//是否單例
	//true:這個bean是單實例,在容器中保存一份
	//false:多實例,每次獲取都會建立一個新的bean;
	@Override
	public boolean isSingleton() {
		return false;
	}
}
相關文章
相關標籤/搜索