在容器中讀取Bean的信息,如遇到對掃包做
public class MainClass { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class); String[] beanDefinationNames = ctx.getBeanDefinitionNames(); for (String name:beanDefinationNames) { System.out.println("bean的定義信息:"+name); } } }
在配置類上通過@CompentScan注解來進行包掃描
@Configuration @ComponentScan(basePackages = {"com.test.testcompentscan"}) public class MainConfig { }
1、排除用法 excludeFilters(排除@Controller注解的,和testService的)
@ComponentScan(basePackages = {"com.tuling.testcompentscan"},excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {TulingService.class}) })
2、包含用法includeFilters,需要注意若使用包含用法,需要把useDefaultFilters屬性設置為false,默認true代表掃全部。排除掉包含Controller、Service
@Configuration
@ComponentScan(basePackages = {"com.tuling.testcompentscan"},includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class})
},useDefaultFilters = false)
public class MainConfig {
}
3、自定義過濾類型
@ComponentScan(basePackages = {"com.tuling.testcompentscan"},includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM,value = TestFilterType.class) },useDefaultFilters = false)
public class TestFilterType implements TypeFilter { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //獲取當前類的注解源信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //獲取當前類的class的源信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //獲取當前類的資源信息 Resource resource = metadataReader.getResource(); System.out.println("類的路徑:"+classMetadata.getClassName()); if(classMetadata.getClassName().contains("dao")) { return true; } return false; } }
組合使用,根據自定義類型排除bean,同時使用包含排除掉Repository的bean
@ComponentScan(basePackages = {"com.test.testcompentscan"},excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM,value = TestFilterType.class) },includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,value = Repository.class) })
@ComponentScan.Filter注解的 tyoe類型
FilterType.ANNOTATION 表示 @Controller @Service @Repository @Compent
FilterType.ASSIGNABLE_TYPE 指定類型
FilterType.CUSTOM 自定義類型 @ComponentScan.Filter(type =FilterType.ASSIGNABLE_TYPE,value = {TestService.class}) /*TestService 繼承 TypeFilter 自定義過濾*/
通過@import注解往容器添加組件 當需要使用到第三方組件的時候使用 ,新建Person,Car ,ImportSelector
public class MainClass { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class); for(String beanName:ctx.getBeanDefinitionNames()) { System.out.println("beanName:"+beanName); } } }
實現接口selectImports,重寫方法selectImports會要求返回字符串的數組,這個數組中放需要加載到容器中的類
/*導入類 會將Person,Car,ImportSelector 加載到容器中*/ @Import(value = {Person.class, Car.class,ImportSelector.class}) public class MainConfig { } public class ImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.tuling.testimport.compent.Dog"}; } }
運行打印
beanName:mainConfig
beanName:com.tuling.testimport.compent.Person
beanName:com.tuling.testimport.compent.Car
beanName:com.tuling.testimport.compent.Dog
通過@Import 使用ImportBeanDefinitionRegistrar類往容器中添加組件
@Import(value = {Person.class, Car.class, TestImportSelector.class, TestBeanDefinitionRegister.class})
public class MainConfig {
}
public class TestBeanDefinitionRegister implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class); registry.registerBeanDefinition("cat",rootBeanDefinition); } }