Spring的扫描机制
自实现一个扫描器
自己实现的扫描器(其实只是继承了ClassPathBeanDefinitionScanner
。Spring内部也是使用这个扫描器进行扫描的!)
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
public class CustomScanner extends ClassPathBeanDefinitionScanner {
public CustomScanner(BeanDefinitionRegistry registry) {
super(registry);
}
}
自定义注解 @Hang
@Retention(RetentionPolicy.RUNTIME)
public @interface Hang {
}
在自己的类上加上@Hang
@Hang
public class ZeHang {
}
main函数:
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext();
ac.register(AppConfig.class);
// 实例化一个Spring的扫描器(这个是Spring自带的)
CustomScanner scanner = new CustomScanner(ac);
/*
这个 scanner 有两个比较重要的方法
1. addExcludeFilter()
添加一个排斥过滤器。假如我们添加了一个 @A, 那么所有被加了@A的类,都不会被扫描器扫描注入容器中
2. addIncludeFilter()
添加一个包含过滤器。加入我们添加了一个 @B, 那么所有加了@B的类,都会报扫描器扫描并注入到容器中
Spring中的@Compoent就是被添加到包含过滤器中!
*/
scanner.addIncludeFilter(new AnnotationTypeFilter(Hang.class));
/*
我们可以通过调用scanner.scan(String... basePackages)来对basePackages包下的类进行扫描
这个方法会放回一个int值,用来表示扫描到的类的个数