Spring AOP: недостатки при его использовании — Функции Spring, использующие Spring AOP, не имеют этих недостатков?

#spring #aop #aspectj #spring-aop

#spring #aop #aspectj #spring-aop

Вопрос:

Я работаю с Spring Framework 3.0.5 и Spring Security 3.0.5, и у меня есть вопросы к программированию, ориентированному на аспекты. На данный момент я пытаюсь выяснить недостатки и преимущества аспектно-ориентированного программирования. Конечно, я знаю их теоретически: я могу избежать избыточного кода, мне нужно только внести изменения в аспект, не везде в коде и так далее. Но у меня все еще есть несколько вопросов:

Недостаток, который я обнаружил:

Я написал пример приложения, используя аспекты с Spring AOP. Я настроил аспект с аннотациями (@Pointcut, @Before, @Aspect и так далее). Методы, которые запускали аспект (которые, конечно, были частью Pointcut), были, конечно, частью другого класса и ничем не аннотировались.

=> Я действительно думаю, что одним большим недостатком является то, что при просмотре этих методов другого класса было неясно, что они запускают аспект. Им не нужны были аннотации или что-либо еще, они были просто упомянуты в примечаниях к аспекту. (Я действительно надеюсь, что вы понимаете, что я имею в виду). Вот почему я думаю, что AOP также делает код менее понятным!

a) Есть ли решение этой проблемы? (Возможно, это можно решить, поместив всю конфигурацию в XML-файл? Я так не думаю.)

б) Будет ли эта проблема по-прежнему существовать, если я буду использовать AspectJ вместо Spring AOP?

Функции Springs, использующие Spring AOP: у них нет этого недостатка?

Поскольку Spring AOP является частью многих функций Spring (точно так же, как декларативное управление транзакциями или (возможно) Spring Security (?)) Я более внимательно рассмотрел эти функции. Я вообще не смог найти никаких недостатков.

c) Давайте возьмем декларативное управление транзакциями в качестве примера: управлять транзакциями так просто с помощью этих аннотаций (@transactional), и я действительно не нахожу недостатка, о котором упоминал выше. Я вижу методы, которые запускают определенное поведение. (все методы @transactional запускают транзакционное поведение) Может быть, я что-то неправильно понял, и AOP используется не здесь? Но если я правильно понял это, почему здесь можно увидеть, какие методы запускают аспекты, и почему это невозможно увидеть в моем примере выше? Я действительно хотел бы это знать!

Спасибо за ответ! 🙂

РЕДАКТИРОВАТЬ: a) и b) получены ответы (используйте IDE, которая помечает эти методы), c) по-прежнему отсутствует 🙂

Ответ №1:

Для пункта b) Если вы используете Eclipse с Spring IDE и плагином AspectJ или STS, IDE покажет вам, в какие аспекты встроены.


Для пункта b) Если вы используете AspectJ и IDE, которая поддерживает AspectJ (Eclipse с плагином AspectJ или STS), то вы увидите маркеры в исходном коде, в которые встроен аспект.

Недостаток AspectJ во время компиляции заключается в том, что вы не можете создавать аспекты в библиотеках. (без передовых методов).


Для пункта c) Есть только один недостаток декларативных аспектов, таких как @Transactional. — Вы можете забыть поместить аннотацию к методу.

Но если у вас есть, например, правило типа: каждый общедоступный метод в классе, аннотируемом @Service (или, если вы хотите создать свой собственный @TransactionalService), является транзакционным, тогда вам не нужно указывать аннотацию @Transactional для каждого метода. — Итак, вкратце: декларативные аспекты очень удобны для чтения (вы не будете их упускать из виду), и они хороши, если ваш код очень (скажем так) «индивидуален» (вместо термина «непротиворечивый»). Но если вы работаете в среде с сильными архитектурными правилами (например, каждый открытый метод в классе @Service …), тогда вы можете записать эти правила в точечном определении вместо использования декларативных аспектов.

Комментарии:

1. Спасибо! полезно знать, что @IDE, поддерживающий AspectJ, показывает маркеры. что касается привязки аспектов к библиотекам, я должен признать, что это слишком специфично для меня и что у меня с этим так мало опыта, что я даже не могу представить пример для этого. Но спасибо, что поделились своими знаниями!

Ответ №2:

На самом деле для пункта а) справедлив тот же ответ, который дал Ральф: используйте Eclipse либо с плагином AspectJ, либо, если вы все равно используете Spring, используйте STS. Таким образом, вы увидите в своей IDE, соответствует ли определенный метод вырезанной точке в левой части вашего редактора, представленной маленькими красными стрелками:

введите описание изображения здесь

Комментарии:

1. Спасибо! Что происходит, когда вы нажимаете на эту красную стрелку? После этого открывается аспект?

2. Если я правильно помню, вы не можете щелкнуть по ним, но вы получаете всплывающую подсказку, в которой говорится что-то вроде «рекомендовано вашим администратором».

3. @nano7: вы не можете нажимать на значки, но углубление показывает, сколько аспектов вплетено. В любом случае, это не проблема, потому что Eclipse (плагин AspectJ) имеет вид «Перекрестных ссылок». — Если вы наведете курсор на такую строку, в представлении «Перекрестные ссылки» будут перечислены все связанные аспекты, и если вы нажмете на них, IDE откроет соответствующий аспект. С другой стороны, если вы размещаете курсор на аспекте, «Перекрестные ссылки» показывают, куда он вплетен.

4. спасибо, Ральф. Ну, я использую NetBeans, так что ….. 🙂 В общем, я действительно думаю, что было бы лучше, если бы в PointCuts тоже были некоторые аннотации, просто чтобы сделать его более читаемым!

5. извините, я имел в виду точки соединения, а не точечные вырезы

Ответ №3:

На самом деле Spring AOP поддерживает создание пользовательских аннотаций.

Я определил аннотацию с именем Loggable binding с рекомендациями.Loggabel может быть применен к любому методу, который вы хотите.

 public @interface Loggable {

}

@Aspect
public class EmployeeAnnotationAspect {

    @Before("@annotation(com.ben.seal.spring.aspect.Loggable)")
    public void myAdvice(){
        System.out.println("Executing myAdvice!!");
    }
}