Durante o desenvolvimento de uma aplicação Grails surgiu a necessidade de alguns métodos serem executados somente em ambiente de produção. Notei que acabávamos tendo que repetir o mesmo código no início de todo método que gostaríamos que tivesse esse comportamento.
Pesquisei como poderia interceptar um método através de uma anotação customizada. Encontrei algumas soluções, mas a que mais achei interessante foi utilizando Spring AOP. Vamos lá!
1. Crie uma anotação
Crie uma anotação customizada. Se ainda não está familiarizado com anotações esse post vai te ajudar.
8 9 10 |
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface ProductionOnly { |
2. Aplique a anotação no método a ser interceptado
Aplique a anotação nos métodos que deseja que sejam executados apenas em produção.
9 10 |
@ProductionOnly public String runProductionOnly(String message) { |
3. Crie o interceptador
1 2 3 4 5 6 7 8 9 10 11 12 |
@Aspect // (1) class ProductionOnlyInterceptor { // (2) @Around("@annotation(com.joasgarcia.productiononlyannotation.ProductionOnly)") def foo(ProceedingJoinPoint joinPoint) { // (3) if (!Environment.getCurrent().equals(Environment.PRODUCTION)) return "NOK" joinPoint.proceed() // (4) } } |
- (1) Indique que a classe é um aspecto do Spring AOP usando a anotação @Aspect
- (2) A anotação @Around indica o tipo de advice utilizado. O Around Advice permite manipularmos o antes e o depois da execução do método interceptado. Essa anotação recebe como argumento um expressão. Chamamos essas expressões de pointcut expressions. No nosso caso a expressão indica que todos os métodos anotados com @ProductionOnly serão interceptados pelo método foo . Veja outros exemplos de pointcut expressions aqui.
- (3) Verifica se o atual ambiente não é produção. Em caso verdadeiro não executa o método interceptado.
- (4) Se o ambiente for de produção chama-se o método proceed para executar o método interceptado.
4. Registre o bean interceptador
Para tudo funcionar registre o bean no resources.groovy da sua aplicação Grails
1 2 3 4 5 |
import com.joasgarcia.productiononlyannotation.ProductionOnlyInterceptor beans = { productionOnlyInterceptor(ProductionOnlyInterceptor) } |
5. Teste
Rode a aplicação de exemplo e acesse /message/productionOnly em ambiente de desenvolvimento e depois em ambiente de produção. Você notará que somente em ambiente de produção será renderizado OK indicando que o método interceptado rodou normalmente.
*
Spring AOP é mais uma das cartas na manga que você pode ter enquanto desenvolvedor Grails. Está ai mais um bom motivo para você começar a estudar Spring e entender melhor como funcionam algumas coisas mágicas no Grails. Um material muito bacana é o guia de Spring da itexto. Leia também a documentação oficial do Grails a respeito do Spring.
E ai? Já havia usado Programação Orientada a Aspecto? Deu para provar um pouco do poder desse recurso? Então compartilhe nos comentários outros usos da AOP 😉