Skip to Content

In Spring configuration xml file, we can define a package for tag component-scan, which tells Spring framework to search all classes within this specified package, to look for those classes which are annotated with @Named or @Component.

/wp-content/uploads/2016/08/clipboard1_1013379.png

I am very curious about how Spring framework achieves this scan, so I have made some debugging to figure it out.

In this blog How to find the exact location where bean configuration file is parsed in Spring framework I have already found the location where the xml configuration file is parsed by Spring framework, so I can directly set breakpoint in found source code.

Here the package to be scanned is parsed from xml file:

/wp-content/uploads/2016/08/clipboard2_1013380.png

And the actual scan is performed in line 87:

/wp-content/uploads/2016/08/clipboard3_1013396.png

Here all classes within the specified package and its children packages are extracted as resource, now I have 7 resources as candidates for scan which makes sense since I have totally 7 classes in the package:

/wp-content/uploads/2016/08/clipboard4_1013397.png

/wp-content/uploads/2016/08/clipboard5_1013398.png

The evaluation to check whether the class has qualified annotation is done in this method:

/wp-content/uploads/2016/08/clipboard6_1013402.png

If the scanned class has at least one annotation ( the annotation written on class is stored in metsadataReader ) which resides in this.includeFilters, then it is considered as a candidate.

/wp-content/uploads/2016/08/clipboard7_1013403.png

By inspecting content of this.includeFilters, we can know that Spring framework considers @Component and @Named as qualified annotation for automatic component scan logic.

/wp-content/uploads/2016/08/clipboard8_1013404.png

/wp-content/uploads/2016/08/clipboard9_1013405.png

Back to my example, since my bean class has @named annotated,

/wp-content/uploads/2016/08/clipboard10_1013406.png

In the runtime, this annotation written in class source code is extracted via reflection, and checked against Spring framework pre-defined annotation set. Here below is how my bean class evaluated as candidate, since it has @Named annotation.

/wp-content/uploads/2016/08/clipboard11_1013407.png

/wp-content/uploads/2016/08/clipboard12_1013408.png

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply