Внутренние компоненты Spring Framework и другие контейнеры IoC

StackOverflow https://stackoverflow.com/questions/230084

  •  04-07-2019
  •  | 
  •  

Вопрос

Я уже некоторое время использую 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, если прокси-серверы вас не устраивают.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top