2008-10-23 7 views
20

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

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

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

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

ответ

28

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

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

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

1

The Spring Framework download поставляется в комплекте с исходным кодом, поэтому вы можете взять пик в коде самостоятельно (внутри папки src), чтобы узнать.

The reference manual также довольно длинный (588 страниц, если вы его загрузили as a PDF).

+3

Спасибо, но я искал способ не погружаться в источник пружины ... Во всяком случае, в PDF не упоминаются внутренние пружины. – 2008-10-23 18:24:02

+0

Я не понимаю, почему это вниз! – 2014-11-14 21:35:30