Внутренние компоненты Spring Framework и другие контейнеры IoC
Вопрос
Я уже некоторое время использую Spring, но мне всегда было интересно, как он работает, более конкретно, как они загружают и ткают бины / классы, помеченные только интерфейсом или @annotation . Р>
Для объявлений xml легко увидеть, как Spring обрабатывает мои bean-компоненты (они объявлены в контексте xml, который читает Spring), но для классов, помеченных только аннотациями, я не вижу, как это работает, так как я не передавайте никаких агентов в JVM или около того.
Я полагаю, что есть некоторая ловушка Java / JVM, которая позволяет вам предварительно обрабатывать классы по каким-то критериям, но я ничего не смог найти в документации.
Может ли кто-нибудь указать мне на некоторые документы? Связано ли это с API java.lang.instrument.ClassFileTransformer ?
Решение
На самом деле по умолчанию Spring не
делать какую-либо постобработку байт-кода
ни для XML, ни
настроенные аннотации bean. Вместо
соответствующие бобы обернуты в динамический
прокси (см., например,
java.lang.reflect.Proxy
в
Java SDK). Динамические прокси обернуть
фактические объекты, которые вы используете и перехватываете
вызовы методов, позволяющие применять AOP
советы. Разница в том, что прокси - это принципиально новые искусственные классы, созданные платформой, тогда как постобработка ткачества / байт-кода меняет существующие. Последнее невозможно без использования API инструментария, который вы упомянули.
Что касается аннотаций, реализация тега <context:component-scan>
будет сканировать путь к классам для всех классов с аннотациями Spring и создавать для них метаданные Spring. После этого они обрабатываются так, как если бы они были настроены с помощью XML (или, если быть более точным, оба обрабатываются одинаково).
Хотя Spring сам по себе не выполняет постобработку байт-кода, вы можете настроить ткацкий агент AspectJ, который будет отлично работать с Spring, если прокси-серверы вас не устраивают.