2016-09-12 6 views
2

В чем преимущество и недостаток этих двух типов систем AOP? Я использую Unity в качестве моей инфраструктуры aop, но я полагаю, что инфраструктура oop для компиляции времени, такая как postsharp, может иметь лучшую производительность, чем временная структура aop во время выполнения? Похоже, что для реализации инъекции используется рефлексивное использование ранга во время выполнения.Временной резерв AOP vs Compile-time AOP

ответ

13

Я не парень .NET, но я знаю мир AOP в экосистеме Java, особенно AspectJ и Spring AOP. В основном существуют 4 типа сторон ткачества:

  • Исходный код ткачества: Аспект код вводится в качестве исходного кода заявления в исходный код приложения. Это своего рода препроцессорный подход. В настоящее время ни один механизм AOP в мире Java не использует этот подход, но раньше в AOP существовали некоторые из них.
    • Преимуществом будет полная независимость от любых исполняемых библиотек или специальных компиляторов AOP во время выполнения, если все сделано правильно.
    • Недостатком был бы раздутый исходный код и шаг предварительной обработки/генерации кода перед компиляцией. Вам всегда нужен сгенерированный исходный код для отладки.
  • Compile время ткачество: код Аспекта вплетен в приложение с помощью специального компилятора.
    • Преимущество в том, что накладные расходы не предназначены для аспектного ткачества. Единственное, что вам нужно, это небольшая библиотека времени выполнения в вашем пути к классам.
    • Недостаток заключается в том, что вы не можете отложить принятие решения, если хотите скомпоновать аспекты в свое приложение вовремя. Но это только проблема, когда дело касается отладочных или трассировочных аспектов, которые не нужны все время. Другим недостатком является то, что этот подход работает только для кода под вашим контролем, т. Е. Вам нужен исходный код. Это не работает для сторонних библиотек.
  • Binary ткачество: код Аспекта вплетен в существующие файлы класс после компиляции, а не во время компиляции.
    • Преимущество в том, что оно также работает для стороннего кода, для которого у вас нет исходного кода. Этот подход также можно смешивать с ткачеством во время компиляции. Вы также избегаете накладных расходов ткачества (см. Ниже).
    • Недостатки аналогичны переплетению во время компиляции: вы не можете удалить аспект после того, как он вплетен в код, просто деактивируйте его выполнение точками, такими как if(). Но это может быть весьма эффективным.
  • время загрузки ткачество (LTW): Ткацкая агент/библиотека загружается в начале при запуске вашей VM/контейнер. Он получает конфигурационный файл с правилами, описывающими, какие аспекты должны быть сплетены в какие классы.
    • Преимущество в том, что вы можете динамически решить, следует ли/переплетать. Если это делается через преобразование байтового кода, а не через динамические прокси или отражение (см. Ниже), результирующий байт-код будет таким же эффективным, как тот, который создается посредством компиляции или бинарного плетения. Другим преимуществом является то, что, подобно бинарному ткачеству, он работает для вашего собственного кода, а также для стороннего кода, если ткацкий агент может «видеть» его, т. Е. Он происходит в дочернем загрузчике классов.
    • Недостатком является одноразовая переплетная служебная информация при запуске приложения, поскольку выполняется переплетение во время загрузки классов.
  • прокси на основе LTW: Эта специальная форма LTW используется Spring AOP в то время как AspectJ делает предыдущие 3 формы, перечисленные выше. Он работает, создавая динамические прокси (например, подклассы или реализации интерфейса) для целей аспекта.
    • Я не могу придумать каких-либо особых преимуществ, кроме, может быть, вашего выбора (например, Spring), чтобы поддержать его.
    • Недостатки - это ограничение общедоступных, нестатических методов и накладных расходов времени исполнения из-за подхода на основе прокси. Он также не фиксирует вызовы внутренних методов, т. Е. Когда прокси-класс вызывает один из своих собственных методов, потому что эти вызовы не захватываются прокси-сервером. Специальные типы pointcuts, такие как перехват конструктора, доступ к переменной чтения/записи члена и многие другие, не поддерживаются, что делает этот подход более «AOP lite». Но этого может быть достаточно для ваших целей.

Как правило, хорошие компиляторы аспект, такие как AspectJ создать очень эффективную байткод и не сильно полагаться на отражение во время выполнения. Если ваша аспектная структура выбора полагается на размышления, возможно, это не очень быстро. Но, возможно, это достаточно быстро, в зависимости от того, насколько сильно вы используете аспекты.

Возможно, я уже написал слишком много, но я мог бы написать еще больше. Вот почему я сейчас останавливаюсь. Кроме того, этот вопрос не подходит для StackOverflow, потому что это может привести к философским дискуссиям и дискуссиям, основанным на мнениях. Надеюсь, мне удалось быть достаточно объективным/беспристрастным.

+2

Действительно благодарен за ваш ответ! – Allen4Tech