Spring AOP: недостатки при его использовании - у функций Spring, которые используют Spring AOP, нет этих недостатков? - PullRequest
3 голосов
/ 11 мая 2011

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

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

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

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

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

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

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

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

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

Спасибо, что ответили! : -)

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

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

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


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


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

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

2 голосов
/ 11 мая 2011

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

enter image description here

0 голосов
/ 12 ноября 2016

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

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

public @interface Loggable {

}

@Aspect
public class EmployeeAnnotationAspect {

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