Spring boot里类的扫描

spring boot里,扫描的class对象是用注解@ComponentScan(未指定的情况下默认是main函数所在package)来指定的。

然后通过类ComponentScanAnnotationParser来读取这些packages,交给ClassPathScanningCandidateComponentProvider来扫描这些类,找到package下所有类的活默认是由PathMatchingResourcePatternResolver来完成的,其实最终还是有jdk里ClassLoader类的getResources方法来做。

这个getResources方法有个path参数,就是指定目录的,如果为空字符或者".",找的是classpath的跟路径,如果指定了路径名,会寻找classpath的路径还有jar文件。

PathMatchingResourcePatternResolver就是通过去递归classpath路径来找所有类的,而对于jar,找到类所属jar文件后,用JarFile类便可以读取文件里所有的类。

对于第三方的包,spring boot是不会主动去扫描的,如果第三方包里有想向spring注册的bean的话,在META-INF目录下放置一个spring.factories的文件,用org.springframework.boot.autoconfigure.EnableAutoConfiguration来指定一个配置类就可以了。

猜你喜欢

转载自weiqingfei.iteye.com/blog/2292769
今日推荐