Posso injetar código na primavera usando anotações AOP?
-
06-07-2019 - |
Pergunta
É possível fazer algo como o seguinte:
public void doStuff(@RequirePrivilege("foo") User user) {
// ...
}
e tê-lo efetivamente executado como se fosse o seguinte?
public void doStuff(User user) {
if(!user.hasPrivilege("foo"))
throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
// ...
}
Eu sei que a Primavera tem vários tipos de suporte AOP, mas o melhor que eu poderia encontrar era código AOP que foi anotado para que ele iria executar antes ou depois de um método específico. Eu quero fazer o inverso e anotar o código que deve ser alterado.
Em última análise, eu poderia apenas fazer a verificação acima dentro do método, mas a forma como anotação de fazer as coisas fornece documentação adicional que torna óbvio que o usuário requer um privilégio especial sem ter de manter a documentação em sincronia com o código.
Solução
Você pode olhar para usando AspectJ para fazer isso, uma vez que irá corresponder em anotações. Você pode então usar um aspecto em torno de decidir se o usuário atende aos requisitos para usar esse método.
Spring permite usar AspectJ, e gostaria de sugerir que, se possível, você não fazer isso em tempo de execução, mas em tempo de compilação, como não há nenhuma razão para pagar o preço para usar este aspecto sempre que você iniciar a aplicação . Mas, se você deve fazê-lo em tempo de execução, em seguida, que é factível, para mim eu tento usar tempo de compilação, tanto quanto possível.
Você pode querer olhar para AspectJ In Action ( http://www.manning.com/laddad2/ ), mas aqui está um exemplo de lá: padrão de assinatura:
* *(@RequestParam
(@Sensitive *))
Descrição
*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*
Exemplo
void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.
Outras dicas
Estou certo de que o seu "privilégios insuficientes" exemplo pode ser feito com Spring AOP , porque é assim que funciona Spring Security. Você pode fazer algumas coisas muito sofisticadas com conselhos ao redor e AspectJ.