sábado, 2 de outubro de 2010

Create a classpath scanner with Spring

Since version 2.5, Spring has used a class path scanner associated with reflexion to find bean definitions. This technique can be used to retrieve some metadata in classes and cache it during spring boot.

As an example, I will map class attribute name to xml tag name.

The code can be grabbed from my github account.

I defined two annotations: XmlMapping to tag classes I want to scan and XmlFieldMapping to store metadata. Once those annotations are defined, I am able to store metadata inside my classes.



Let's write a class that will extract metadata contained inside an annotated class:

Extractor class iterates over each attribute and extracts metadata. Those information are stored in XmlMetadata. Doing so, we are caching those information and this reflexion code will be executed only once.

The class path scanner will scan a directory looking for classes containing XmlMapping annotation. All found classes will be passed to the extractor in order to store metadata contained inside XmlMetadata.

In order to scan the package, we use a spring class named ClassPathScanningCandidateComponentProvider. We can construct it using true the default configuration. This default configuration will find any classe defining a spring bean. Here we pass false and pass XmlMapping annotation as a filter. The init() method is called when spring boot using the init-method attribute in spring configuration.