Могу ли я внедрить код в spring, используя аннотации AOP?

StackOverflow https://stackoverflow.com/questions/1015852

  •  06-07-2019
  •  | 
  •  

Вопрос

Возможно ли сделать что-то вроде следующего:

public void doStuff(@RequirePrivilege("foo") User user) {
    // ...
}

и чтобы это эффективно работало так, как если бы это было следующее?

public void doStuff(User user) {
    if(!user.hasPrivilege("foo"))
        throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
    // ...
}

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

В конечном счете, я мог бы просто выполнить вышеуказанную проверку внутри метода, но способ выполнения аннотаций предоставляет дополнительную документацию, которая делает очевидным, что пользователю требуются определенные привилегии без необходимости синхронизировать документацию с кодом.

Это было полезно?

Решение

Вы можете посмотреть на использование AspectJ для этого, так как оно будет соответствовать аннотациям.Затем вы можете использовать обходной аспект, чтобы решить, соответствует ли пользователь требованиям для использования этого метода.

Spring позволяет вам использовать AspectJ, и я бы посоветовал, если возможно, делать это не во время выполнения, а во время компиляции, поскольку нет причин платить цену за использование этого аспекта при каждом запуске приложения.Но, если вы должны сделать это во время выполнения, то это выполнимо, для меня я стараюсь использовать время компиляции как можно чаще.

Возможно, вы захотите посмотреть на AspectJ в действии (http://www.manning.com/laddad2/) но вот пример оттуда:Шаблон подписи:

* *(@RequestParam
(@Sensitive *))

Описание

*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*

Пример

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.

Другие советы

Я уверен, что ваши " недостаточные права " Пример можно сделать с помощью Spring AOP , потому что это как работает Spring Security. Вы можете сделать некоторые очень сложные вещи с помощью советов и AspectJ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top