Composants internes de Spring Framework et autres conteneurs IoC
Question
J'utilise Spring depuis un certain temps, mais je me suis toujours demandé comment ça marche, plus précisément, comment charger et tisser des beans / classes marqués uniquement avec une interface ou @annotation .
Pour les déclarations xml, il est facile de voir comment spring traite mes haricots (ils sont déclarés dans le contexte xml que printemps lit), mais pour les classes marquées uniquement par des annotations, je ne vois pas comment cela fonctionne, car ne passez aucun agent à la JVM ou à ce moment-là.
Je pense qu’il existe un hook Java / JVM qui vous permet de prétraiter les classes selon certains critères, mais je n’ai rien trouvé dans la documentation.
Quelqu'un peut-il m'indiquer des documents? Est-ce lié à l'API java.lang.instrument.ClassFileTransformer ?
La solution
En fait, par défaut, Spring ne le fait pas
faire un post-traitement de bytecode
ni pour XML-, ni
Beans configurés avec des annotations. Au lieu
haricots pertinents sont emballés dans dynamique
procurations (voir par exemple
java.lang.reflect.Proxy
dans le
Java SDK). Les mandataires dynamiques enveloppent le
objets réels que vous utilisez et interceptez
appels de méthode, permettant d'appliquer l'AOP
conseils. La différence réside dans le fait que les mandataires sont essentiellement de nouvelles classes artificielles créées par le cadre, alors que le post-traitement tissage / bytecode modifie les classes existantes. Ce dernier est impossible sans l’API Instrumentation que vous avez mentionnée.
En ce qui concerne les annotations, la mise en œuvre de la balise <context:component-scan>
analysera le chemin d'accès aux classes pour toutes les classes avec les annotations Spring et créera des espaces réservés pour les métadonnées Spring. Après cela, ils sont traités comme s'ils avaient été configurés via XML (ou pour être plus spécifiques, les deux sont traités de la même manière).
Bien que Spring ne fasse pas lui-même de post-traitement du bytecode, vous pouvez configurer l'agent de tissage AspectJ qui devrait fonctionner correctement avec Spring, si les procurations ne vous satisfont pas.