本文共 1399 字,大约阅读时间需要 4 分钟。
扫描指定目录下的带有@component注解极其派生类,然后将这些类的实例交给BeanDefinitionReqistry,调用其containsBeanDefinition方法判断是否已经存在,如果不存在,则调用registerBeanDefinition,该类在spring的重要性我个人觉得重中之重,不过很多人似乎都对此不感冒,后来我才知道,他们并不了解spring
public static void main(String[] args) { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(new MyBeanDefinitionRegistry()); //扫描指定包下,还有另一个重载方法扫描指定类下的同目录极其子目录下 scanner.scan("com.example.studyintegration.spring.aop"); }
如果我们还有自己的需求,想把没有带@component注解的类也注册到BeanDefinitionRegistry中,应该怎么办呢,那么需要ClassPathBeanDefinitionScanner类的补充类,AnnotatedBeanDefinitionReader,请参考文章Spring-AnnotatedBeanDefinitionReader
创建时机
在spring当中,创建BeanFactory的时候,那个具体的BeanFactory里一定会new一个ClassPathBeanDefinitionScanner,比如如下代码ConfigurableApplicationContext applicationContext = new AnnotationConfigApplicationContext("包1","包2");
我们进入AnnotationConfigApplicationContext的构造方法
public AnnotationConfigApplicationContext(String... basePackages) { //你会发现在此处调用了默认的构造方法,我们再去下面看默认构造方法 this(); scan(basePackages); refresh(); }
接下来我们看默认的构造方法
public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }
没错,就是在这里,new了一个ClassPathBeanDefinitionScanner,参数是BeanDefinitionRegistry,也就是this,此处正好应和了前文的“创建时机”
现在,我知道了ClassPathBeanDefinitionScanner这个类是在创建BeanFactory的时候创建的,这是很重要的一步探索,那么创建完毕之后,坐等调用ClassPathBeanDefinitionScanner的scan方法
转载地址:http://bxhws.baihongyu.com/