Могу ли я вводить код весной, используя аннотации АОП?

Is it possible to do something like the following:

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

and have it effectively run as if it were the following?

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

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

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


person HappyEngineer    schedule 19.06.2009    source источник


Ответы (2)


Вы можете посмотреть на использование 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.
person James Black    schedule 24.09.2009

Я уверен, что ваш пример с «недостаточными привилегиями» можно выполнить с помощью Spring AOP, потому что так работает Spring Security. Вы можете делать очень сложные вещи, используя советы вокруг и AspectJ.

person duffymo    schedule 19.06.2009