Spring使用——給容器註冊組件

配置類

/**

  • 給容器註冊組件:
  • 1)包掃描+組件標註註解(@Controller,@Service,@Component,@Repository)[侷限:自己寫的]
  • 2)@Bean [導入的第三方包裏面的組件]
  • 3)@Import[快速的給容器中導入組件]
  • 1)@Import(要導入到容器中的組件),容器中就會自動註冊這個組件,id默認是全類名
  • 2)@ImportSelecor:返回需要導入的組件的全類名的數組
  • 3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中
  • 4)Spring提供的FactoryBean(工廠Bean)
  •  	1)默認獲取的是工廠Bean調用getObejct()創建的對象
    
  •      2)要想獲取工廠類型的Bean,我們需要再beanId前面添加一個&符號
    

*/

package com.ysy.config;

import com.ysy.bean.Color;
import com.ysy.bean.ColorFactoryBean;
import com.ysy.bean.Red;
import com.ysy.Person;
import com.ysy.condition.LinuxCondition;
import com.ysy.condition.MacCondition;
import com.ysy.condition.MyImportBeanDefinitionRegistrar;
import com.ysy.condition.MyImportSelector;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;

/**
 * @author shanyangyang
 * @date 2020/5/27
 */
@Configuration
//導入組件,id默認是全類名
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
	/**
	 * 默認是單例的
	 * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
	 * 單實例情況下,ioc容器啓動會調用方法創建對象放到IOC容器中,以後每次調用從容器中(map.get)拿;
	 * request:同一個請求
	 * session:同一個session
	 *
	 * 懶加載:
	 * 		單實例bean,容器啓動時,先不創建對象,第一次使用的時候再創建對象,並進行初始化
	*/
//	@Scope("prototype")
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("給容器添加bean");
		return new Person("zhangsan",21);
	}

/**@Conditional
 * 按照一定條件進行判斷,滿足條件註冊Bean
 *如果是windows系統則註冊ali,否則註冊百度;
 * 可以放在類上,表示condition爲true時,配置類中所有bean一起生效
*/

@Conditional({MacCondition.class})
@Bean("ali")
public Person person01(){
	return new Person("alibaba",12);
}

@Conditional({LinuxCondition.class})
	@Bean("baidui")
	public Person person02(){
		return new Person("baidu",24);
	}

/**
 * 給容器註冊組件:
 * 1)包掃描+組件標註註解(@Controller,@Service,@Component,@Repository)[侷限:自己寫的]
 * 2)@Bean [導入的第三方包裏面的組件]
 * 3)@Import[快速的給容器中導入組件]
 *    1)@Import(要導入到容器中的組件),容器中就會自動註冊這個組件,id默認是全類名
 *    2)@ImportSelecor:返回需要導入的組件的全類名的數組
 *    3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中
 *    4)Spring提供的FactoryBean(工廠Bean)
 *    		1)默認獲取的是工廠Bean調用getObejct()創建的對象
 *    	    2)要想獲取工廠類型的Bean,我們需要再beanId前面添加一個&符號
*/

@Bean
	public ColorFactoryBean colorFactoryBean(){
	return new ColorFactoryBean();
}
}

其中的實體類

package com.ysy.bean;

/**
 * @author shanyangyang
 * @date 2020/5/29
 */
public class Color {
}

package com.ysy.condition;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author shanyangyang
 * @date 2020/5/29
 * 自定義邏輯,返回需要導入的組件
 */
public class
MyImportSelector implements ImportSelector {
	//返回值就是導入到容器中的組件全類名
	//AnnotationMetadata:當前標註@Import註解的類的所有註解信息
	//方法不要返回null
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {

		return new String[]{"com.ysy.Bean.Blue","com.ysy.Bean.Yellow"};
	}
}
package com.ysy.condition;

import com.ysy.bean.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author shanyangyang
 * @date 2020/5/29
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	/**
	 *AnnotationMetadata:當前類的註解信息
	 * BeanDefinitionRegistry:BeanDefinition註冊類
	 * 		把所有需要添加到容器中的bean,調用BeanDefinitionRegistry.registerBeanDefinition手工註冊
	 * */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
			BeanNameGenerator importBeanNameGenerator) {

		boolean definition = registry.containsBeanDefinition("com.ysy.Bean.Red");
		boolean definition1 = registry.containsBeanDefinition("com.ysy.Bean.Blue");
		if(definition && definition1){
			//指定Bean定義信息,(bean的類型等等)
			RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
			//註冊一個Bean,指定Bean名字
			registry.registerBeanDefinition("rainBowl",rootBeanDefinition);
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章