#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!!");
}
}