2013-06-26 2 views
4

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

Я думаю, что AspectJ будет загружать/выгружать время загрузки и разгружать класс. Кто-нибудь попробовал? Любые рекомендации? Спасибо.

+0

Я знаю, что это одна старая, но до сих пор числятся без ответа. Не могли бы вы согласиться и перенести мой ответ, если это будет уместно? Благодарю. – kriegaex

ответ

8

Несколько вещей, чтобы рассмотреть следующие вопросы:

  • Правда, вы можете сделать LTW во время загрузки класса, но не после уже загружен класс.
  • Нет такой концепции, как разгрузка классов, потому что для разгружаемого класса она должна быть собрана в мусор, и для этого не должно существовать никаких ссылок на класс. Даже если это было так, спецификация JVM AFAIK объявляет ее необязательной, независимо от того, будет или нет, и когда разгрузка или GC должны удалить уже загруженный класс. Вы никогда не могли бы положиться на это.

Сказав это, вы можете попробовать такие концепции, как OSGi, или написать свой собственный загрузчик классов (или найти один из многих существующих в Интернете), который загружает каждый класс или каждый JAR в отдельный экземпляр класса. Это может стать сколь угодно сложным, так что, может быть, вы хотите, чтобы рассмотреть этот простой подход, пока он находится в пределах технических границ вашей ситуации:

  • компилировать ваши аспекты в ваш код или использовать LTW, это не имеет никакого значения. Просто убедитесь, что код аспекта сплетается до того, как классы фактически используются. Время компиляции, очевидно, больше, чем скоро, время загрузки всего лишь достаточно скоро, но отлично.
  • Используйте if() pointcuts для всех соответствующих советов и предоставите средство для динамического изменения значения переменной, используемой pointcut, чтобы включить динамическое включение и выключение рекомендаций. Накладные расходы на производительность обычно минимальны, не беспокойтесь. Просто попробуйте, прежде чем говорить, что это слишком дорого.

Это решение удовлетворяет вашим условиям, что оно может быть (де) активировано динамически и что после того, как был скомпонован аспектный код, не требуется перезапуск JVM.

+0

Ну, это несет ответственность за разработчика, чтобы написать аспекты, которые можно включить/отключить. И я хотел бы избежать этого. – Faustas

+0

Я думал об использовании JRebel или любого другого инструмента для перезагрузки при загрузке. Поскольку классы загружаются во время выполнения, мое предположение заключается в том, что оно позволит повторно переплетать и при повторной загрузке. – Faustas

+0

Хм, я думаю, что у разработчиков действительно есть обязанности. Основные разработчики кода отвечают за базовый код, а также разработчики аспектов отвечают за сквозные проблемы. Поэтому я думаю, что это не слишком много. Во всяком случае, только потому, что вы мне любопытно, я дал JRebel быструю попытку в прошлые выходные и использовал ее с AspectJ. Он хорошо работал для компиляции во времени, но я не мог заставить его работать в течение 5 минут (что мало значит) с ткачеством с загрузкой. Это хороший инструмент для разработчиков, но я не уверен, что буду использовать его в производстве. – kriegaex

6

Аспект

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

не имеет смысла. Однако вы можете создать аспект ведения журнала и применить его во всем приложении с помощью AOP.


Ткацкого

ткачества процесс применения аспектов к целевому объекту, чтобы создать новый, объект прокси. Аспекты вплетены в целевой объект с указанными точками соединения. Плетение может происходить в нескольких точках в жизни целевого класса:

  • времени компиляции: Аспекты ткут при компиляции целевого класса. Для этого требуется специальный компилятор.
  • Время загрузки: Аспекты сотканы, когда целевой класс загружается в JVM. Для этого требуется специальный ClassLoader, который усиливает байт-код целевого класса до ввода класса в приложение.
  • Runtime: Аспекты сплетены когда-то во время выполнения приложения. Как правило, контейнер AOP будет динамически сгенерировать прокси-класс, который будет делегировать целевому классу, а сплетение в аспектах.

enter image description here
enter image description here

(Source)

+4

На самом деле это не вопрос. Это просто общая информация об АОП. – Dennis