一般來說,向容器中注冊元件有下面幾種方式
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注冊到容器中,并測試列印,看容器中是否已加載此類
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwEkaNNTTU5kejRVT4VkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4ADNxQDO0EjM5ETNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
分别使用
@Import(Dog.class)
@Import({Dog.class,Cat.class})
ImportSelector可以批量導入元件的全類名數組,自定義邏輯傳回需要導入的元件CaojiuluImportSelector.java
@Import({Dog.class,Cat.class,CaojiuluImportSelector.class})
建立CaojiuluImportSelector, 建立Fish Tiger類(與建Cat和Dog一樣)
測試:
當然,除了以上,還可以通過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;
}
}