Внутренние компоненты Spring Framework и другие контейнеры IoC - PullRequest
22 голосов
/ 23 октября 2008

Я уже некоторое время использую Spring, но мне всегда было интересно, как он работает, более конкретно, как они загружают и ткают бины / классы, помеченные только интерфейсом или @ annotation .

Для объявлений xml легко увидеть, как Spring обрабатывает мои bean-компоненты (они объявлены в контексте xml, который читает Spring), но для классов, помеченных только аннотациями, я не вижу, как это работает, так как я не передавайте никаких агентов в JVM или около того.

Я полагаю, что есть некоторая ловушка Java / JVM, которая позволяет вам предварительно обрабатывать классы по какому-то критерию, но я ничего не смог найти в документации.

Может кто-нибудь указать мне на некоторые документы? Это связано с java.lang.instrument.ClassFileTransformer API?

1 Ответ

30 голосов
/ 24 октября 2008

Собственно по умолчанию Spring не делать какую-либо постобработку байт-кода ни для XML, ни настроенные аннотации bean. Вместо соответствующие бобы обернуты в динамический прокси (см., например, java.lang.reflect.Proxy в Java SDK). Динамические прокси обернуть фактические объекты, которые вы используете и перехватываете вызовы методов, позволяющие применять AOP советы. Разница в том, что прокси - это принципиально новые искусственные классы, созданные фреймворком, тогда как постобработка ткачества / байт-кода изменяет существующие. Последнее невозможно без использования API инструментария, который вы упомянули.

Что касается аннотаций, реализация тега <context:component-scan> отсканирует путь к классам для всех классов с аннотациями Spring и создаст для них метаданные Spring. После этого они обрабатываются так, как если бы они были настроены с помощью XML (или, если быть более точным, оба обрабатываются одинаково).

Хотя Spring не выполняет саму постобработку байт-кода, вы можете настроить ткацкий агент AspectJ, который будет отлично работать с Spring, если прокси-серверы вас не удовлетворяют.

...