2014-12-20 2 views
6

Say Service вызывает класс Dao, на котором должен применяться атрибут ведения журнала (аннотационный). Мне интересно, как применяются аспекты.Насколько весенние аспекты работают внутри?

В соответствии с моим пониманием во время внедрения DAO под объектом Service весна обнаруживает, что в DAO настроен какой-то аспект (в этом случае ведение журнала), поэтому он вводит прокси-объект вместо реального целевого объекта. Теперь, когда фактический вызов выполняется любым методом внутри DAO, прокси-сервер применяет аспекты, а затем вызывает фактический объект цели . Это верно ? Кроме того, я считаю, что это называется Run time weaving.

С другой стороны, то же самое можно сделать с использованием ткачества времени загрузки (с конфигурацией javaagent), где обработка байтового кода выполняется для классов, по которым необходимо применять аспекты. Таким образом, прокси не фигурирует здесь.

Пожалуйста, исправьте меня, если я ошибаюсь, поскольку это основа для всех модулей пружин?

ответ

5

Ваше понимание правильное. Spring AOP основан на прокси-сервере. Spring использует либо прокси-серверы JDK (предпочтительнее, когда прокси-сервер реализует хотя бы один интерфейс), либо прокси CGLIB (если целевой объект не реализует никаких интерфейсов), чтобы создать прокси-сервер для данного целевого компонента.

Если не указано иное, Spring AOP выполняет вождение во время выполнения. Тем не менее, вы можете настроить Spring для выполнения переплета времени через AspectJ. Для получения более подробной информации обратитесь к documentation link.

Ссылка для Spring AOP proxying internals

+0

Я считаю, что время переплета времени лучше с точки зрения производительности, так как при определении того, следует ли вводить прокси-сервер, на основе конфигурации аспекта, которая будет иметь место для плетения времени выполнения, не будет. Да, в загрузке времени для запуска процесса ткацкого старта потребуется бит дольше, но это нормально, поскольку его однократная активность –

+0

. Производительность может быть лучше в процессе загрузки времени (или, более конкретно, для компиляции времени). Лучше всего было бы проверить это на самом деле с помощью теста нагрузки) но есть и другие области, которые вы, возможно, захотите рассмотреть, как изменения в системе сборки.Вы бы включили этот шаг до создания ваших артефактов. –

+1

Просто полезная цитата - «* Все проблемы в информатике могут быть решены другим уровнем косвенности, за исключением, конечно, проблемы слишком большого числа направлений. *» - Дэвид Уилер – smwikipedia

1

Еще есть две точки, чтобы уточнить здесь

Сначала один в моем посте на самом деле время загрузки ткачество не во время выполнения ткачество

Из этого link

нагрузки (LTW) - это просто бинарное ткачество, отложенное до момента, когда загрузчик классов загружает файл класса и определяет класс для JVM. Чтобы поддержать это, требуются один или несколько «загрузчиков класса ткачества», предоставляемые явным образом средой выполнения или включаемой с помощью «ткацкого агента».

Второе одно время компиляции ткачество

во время компиляции ткачество это самый простой подход. Когда у вас есть исходный код для приложения, ajc будет компилироваться из источника и создавать файлы сплетенных классов в качестве вывода. Вызов ткача является неотъемлемой частью процесса компиляции ajc. Сами аспекты могут быть в исходной или двоичной форме. Если эти аспекты необходимы для компиляции затронутых классов, вы должны переплетаться во время компиляции. Аспекты требуются, например, когда они добавляют членов в класс и другие классы, которые компилируются, ссылаются на добавленные элементы.

Смежные вопросы