2018年4月30日 星期一

ImportSelector、ImportBeanDefinitionRegistrar (Spring 4.x 二)

@Import、ImportSelector、ImportBeanDefinitionRegistrar (源碼的 @Import 有說明)
這三個在 3.x 就已經有了,但 ImportSelector 在 4.2 可以不加 annotation
@Import 是對沒有 @Component 相關的 annotaion,也可以像有加一樣,而其他兩個也是差不多的功能,只不過不是 annotation

※ImportSelector

public class ISPractice implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// ... 一些判斷
        return new String[]{"bruce.home.bean.Ppp"};
    }
}

※回傳時,要寫包名+類別名

※AnnotationMetadata 參數表示誰加載它的所有 annotation,如下面的 Animal,可以取得 @Configuration 和 @Import


※bean

@Configuration
@Import({ISPractice.class})
public class Animal {}
    
    
    
//@Component 4.2
public class Ppp {}

※Ppp 類別在 4.2 (含)以上可以不寫


※測試

@Test
public void testApp() {
    AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Animal.class);
    for (String s : app.getBeanDefinitionNames()) {
        System.out.println(s);
    }
    app.close();
}





※ImportBeanDefinitionRegistrar

public class IBDRPractice implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        if (registry.containsBeanDefinition("animal")) {
            registry.registerBeanDefinition("xxx", new RootBeanDefinition(Ppp.class));
        }
    }
}

※如果 spring 的 IOC 裡有 animal 這個 bean,那就將 Ppp 這個類別註冊進來,id 叫 xxx


※bean

@Configuration
@Import({IBDRPractice.class})
public class Animal {}
    
    
    
public class Ppp {}

※測試類和 ImportSelector 一樣

※Ppp 類別,從3.x 版就可以不寫了

沒有留言:

張貼留言