這三個在 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 版就可以不寫了
沒有留言:
張貼留言