天天看點

Spring源碼分析(六)-注解Import注冊bean

一般來說,向容器中注冊元件有下面幾種方式

1.包掃描群組件标注注解(@Controller @Service @Repository @Component),一般針對我們自己寫的類

[email protected]【導入第三方和包的元件,比如前面的person類,需要在IOC容器中使用】

3.使用@Import【快速給容器導入一個元件】注:bean有點簡單,構造一個無參或有參的bean

    a,@Import({要導入容器中的元件}),容器自動注冊,id為類的全路徑

    b,ImportSelector 是一個接口,傳回需要導入的元件的全類名數組

    c,ImportBeanDefinitionRegistrar:可以手動添加元件到IOC容器, 所有Bean的注冊可以使用BeanDifinitionRegistry

4.使用Spring提供的FactoryBean(工廠bean)進行注冊

     注意:預設擷取到的是工廠bean調用的getObject建立的對象,如果需要擷取工廠bean本身,需要在id前加一個               &caojiuluFactoryBean

同樣按流程先建立Cap6MainConfig.java配置類

建立Dog.ava類----->public class Dog {}

建立Cat.java類---->public class Cat{}

使用import将dog, cat的bean注冊到容器中,并測試列印,看容器中是否已加載此類

Spring源碼分析(六)-注解Import注冊bean

分别使用 

@Import(Dog.class)   

@Import({Dog.class,Cat.class})

ImportSelector可以批量導入元件的全類名數組,自定義邏輯傳回需要導入的元件CaojiuluImportSelector.java

@Import({Dog.class,Cat.class,CaojiuluImportSelector.class})

建立CaojiuluImportSelector, 建立Fish  Tiger類(與建Cat和Dog一樣)

Spring源碼分析(六)-注解Import注冊bean

測試:

Spring源碼分析(六)-注解Import注冊bean

當然,除了以上,還可以通過ImportBeanDefinitionRegistrar自定義注冊,向容器中注冊bean;

@Import({Dog.class,Cat.class,CaojiuluImportSelector.class,CaojiuluImportBeanDefinitionRegistrar.class})

建立CaojiuluImportBeanDefinitionRegistrar自定義注冊類,實作bean注冊

package com.caojiulu.cap6.config;

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

public class CaojiuluImportSelector implements ImportSelector{

	//傳回值,就是導入到容器中的元件全類名
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		// TODO Auto-generated method stub
		return new String[]{"com.caojiulu.cap6.bean.Fish","com.caojiulu.cap6.bean.Tiger"};
	}

}
           

當然除了以上加載方式,還可以通過實作FactoryBean接口方式來加載bean

* 使用spring提供的FactoryBean(工廠bean)

 *   beans.factory.FatoryBean源碼跟進去

 *     容器調用getObject()傳回對象,把對象放到容器中;

 *     getObjectType()傳回對象類型

 *     isSingleton()是否單例進行控制

 *     建立CaojiuluFactoryBean實作FactoryBean

 *     在config裡建立caojiuluFactoryBean()方法

 *     寫完test03測試用例後:

 *       a,預設擷取到的是工廠bean調用getObject建立的對象

 *       b,要擷取工廠Bean本身,需要在id前加個  &caojiuluFactoryBean

 */

package com.caojiulu.cap6.config;

import org.springframework.beans.factory.FactoryBean;

import com.caojiulu.cap6.bean.Pig;

public class CaojiuluFactoryBean implements FactoryBean<Pig>{
	@Override
	public Pig getObject() throws Exception {
		// TODO Auto-generated method stub
		return new Pig();
	}
	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return Pig.class;
	}
	
	@Override
	public boolean isSingleton(){
		return true;
	}

}
           
Spring源碼分析(六)-注解Import注冊bean