A combinação Spring AOP/AspectJ oferece muitas escolhas, sejam elas relacionadas ao sistema AOP (bytecode-based ou AOP proxy-based), relacionadas à sintaxe (AspectJ tradicional, @AspectJ ou sintaxe XML) ou opções de weaving (build time ou load-time weaver) e um entendimento claro de todas estas escolhas é muito importante para aplicá-las de forma prática quando se utiliza Aspectos em aplicações corporativas.
Ramnivas Laddad disse apenas que um tipo de AOP não se adaptará a todas aplicações e escolher a combinação certa ajudará desenvolvedores a serem bem sucedidos com a AOP. Ele fez uma apresentação na recente confêrencia SpringOne Americas sobre os vários designs AOP, escolhas de implementação do Spring AOP framework e as melhores práticas de utilização em suas aplicações web.
Ramnivas discutiu as vantagens e as limitações do weaving no AspectJ e da abordagem proxy-based do Spring AOP. Escolher entre Spring AOP e AspectJ depende de alguns designs e fatores ambientais. Utilize o Spring AOP nos seguintes cenários:
- a interceptação somente a nível de método é suficiente.
- a potência total do AOP é demais.
- Não quer usar um compilador especial como o compilador do AspectJ (AJC).
- Cross-cutting de domains objects não é necessário.
- Aspectos pré-escritos satisfazem suas necessidades.
Utilize AspectJ AOP em todos os outros cenários. Ele listou alguns exemplos de aplicações de AspectJ (tracing detalhado e monitoramento, domain objects, segurança) e AOP proxy (gerenciamento de transação, monitoramento JXM, trabalho remoto e segurança). Na apresentação, Ramnivas mostrou as diferenças entre o AspectJ tradicional e as opções de sintaxe @AspectJ com exemplos de código.
Weaving no ApectJ inclui as opções: compile-time ou load-time weaving (LTW). Quando utilizar a opção LTW, você pode usar o Spring-driven LTW que permite interlaçar aspectos sem que o container inicie modificações de script (sem -javaagent) ou por meio do agente JPA do Spring usando a opção de configuração
. A comparação entre estas duas opções de weaving é a seguinte:
Build-time (compile/binary):
- Custo do Weaving no build time, mas toda velocidade no load-time.
- Construir sistema de modificações são necessárias.
- Não são necessárias mudanças no deploy.
- Melhor suporte de IDE com Eclipse AspectJ Development Tools (AJDT).
Load-time:
- Velocidade do Load-time e footprint de memória afetada.
- Constrói sistema inalterado, mas mudanças de implementação são necessárias para interlaçar os aspectos.
- Não suporta ferramenta IDE.
Design AOP escolhe incluir a implementação do pointcut usando assinaturas join point e usando wildcards para escolher uma variedade de join points. Metadata (Anotações) podem também ser usados para capturar os join points que oferece as seguintes vantagens e desvantagens:
- Vantagens:
Anotations é uma maneira fácil de capturar certas preocupações nas aplicações. Elas ajudam a limitar a colaboração entre aspecto e as classes para apenas anotações. - Desvantagens:
A colaboração a partir das classes é necessária. Além disso, os excessos de anotações podem encobrir as propriedades esquecidas da AOP.
Algumas das melhores práticas na utilização de metadata para implementação da AOP são:
- Anotações são melhores para expressar as características intrínsecas de um programa de elemento.
- Eles deveriam descrever o que é verdade no join point - o que não precisaria acontecer nesses points.
- Evite implementação especifica de anotações
- Anotações deveriam descrever o que é verdade no elemento anotado. Por exemplo, para capturar um cenário do tipo somente leitura, utilize @ReadOnly no nome da anotação e não @TakeReadLock. E para marcar um método que precisa ser transacional utilize @Transactional e não @JTATransactional.
- Não utilize anotações para criar macros.
- Utilize anotações que já existem como JPA (@Entity, @Table), JAX-WS (@WebService, @WebMethod), Spring (@Component, @Service, @Autowired, @ManagedResource).