1. 程式人生 > >SpringBoot給容器中註冊元件的四種方法(簡易版)

SpringBoot給容器中註冊元件的四種方法(簡易版)

本文介紹的方法比較簡潔,需要有Spring基礎

方法一:包掃描+註解

1.配置類,標明註解掃描的範圍

//告訴Spring這是一個配置類
@Configuration
//註解所掃描的範圍,類似於spring配置檔案的 context:component-scan
@ComponentScan(value="com.java")
public class MainConfig {

}

 2.註解,與Spring一樣

//標識表現層
@Controller
public class BookController {

}
//標識持久層 
@Repository
public class BookDao {

}
//標識服務層 
@Service
public class BookService {

}

方法二:@Bean   直接在配置類裡標明

//告訴Spring這是一個配置類
@Configuration
public class MainConfig {

    // 1. 給容器中註冊一個Bean;型別為返回值的型別,id預設是用方法名作為id
    // 2. 可以在Bean括號裡面設定id
    @Bean("person")
    public Person person(){
        return new Person("張三", 20);
    }
}

方法三:@Import   快速給容器中匯入元件

    情況一:直接匯入

//配置類
@Configuration
@Import({Color.class, Red.class})	//快速匯入元件
public class MainConfig {

}

    情況二:自定義要匯入的元件

//配置類
@Configuration
@Import({MyImportSelector.class})    //MyImportSelector 需要實現 ImportSelector 介面
public class MainConfig2 {

}
//自定義邏輯,返回需要匯入的元件
public class MyImportSelector implements ImportSelector {

	//返回值就是要匯入到容器的元件全類名,不要返回null
	//AnnotationMetadata:當前標註@Import註解的類的資訊
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		// TODO Auto-generated method stub
		
		return new String[]{"com.java.bean.Yellow"};
	}

}

    情況三:手動註冊要匯入的Bean

//配置類
@Configuration
// MyImportBeanDefinitionRegistrar 需要繼承 ImportBeanDefinitionRegistrar 介面
@Import({MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {

}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	/**
	 * AnnotationMetadata: 當前類的註解資訊
	 * BeanDefinitionRegistry: BeanDefinition註冊類,
	 * 			把所有需要註冊的Bean,手動註冊進來
	 */
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// TODO Auto-generated method stub
		// 1. 容器類是否已經有名為Blue的類
		boolean bool = registry.containsBeanDefinition("com.duojia.bean.Blue");
		// 2. 沒有,就註冊進來
		if( !bool ) {
			//指定bean名
			RootBeanDefinition beanDefinition =  new RootBeanDefinition(Blue.class);
			registry.registerBeanDefinition("自定義Blue", beanDefinition);
		}
	}

}

方法四:使用Spring提供的 FactoryBean(工廠Bean).

//配置類
@Configuration
public class MainConfig2 {

    //ColorFactoryBean 為自定義的工廠 Bean,需要實現 FactoryBean 介面
    @Bean
    public ColorFactoryBean coloFactoryBean() {
        return new ColorFactoryBean();
    }

}
//建立一個 Spring 定義的 FactoryBean(工廠Bean)
public class ColorFactoryBean implements FactoryBean<Color> {

        //預設獲取到的是 FactoryBean 呼叫 getObject 建立的物件
	public Color getObject() throws Exception {
		// TODO Auto-generated method stub

		System.out.println("建立一個Color");
		return new Color();
	}

	//設定 Bean 的型別
	//雖然定義的是 FactoryBean,但實際上獲取的是 Color
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub

		return Color.class;
	}

	// 返回值:true	單例項,ioc 容器在啟動時,就會載入方法呼叫物件,且只會載入一次
	//        false	多例項,ioc 容器只有在獲取時,才會載入方法呼叫物件,每獲取一次就會載入一次
	public boolean isSingleton() {
		// TODO Auto-generated method stub

		return false;
	}

}