SpringBoot給容器中註冊元件的四種方法(簡易版)
阿新 • • 發佈:2018-12-17
本文介紹的方法比較簡潔,需要有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;
}
}