Spring AOP vs AspectJ

Tenho a impressão de que o Spring AOP é melhor usado para tarefas específicas de aplicativos, como segurança, log, transactions, etc., pois usa annotations Java5 personalizadas como uma estrutura. No entanto, o AspectJ parece ser um padrão de design mais amigável.

Alguém pode destacar os vários prós e contras do uso do Spring AOP vs AspectJ em um aplicativo Spring?

Profissionais do Spring-AOP

  • É mais simples de usar que o AspectJ, já que você não precisa usar LTW ( tecelagem de tempo de carregamento ) ou o compilador AspectJ.

  • Ele usa o padrão Proxy e o padrão Decorator

Contras da spring-AOP

  • Este é o AOP baseado em proxy, então basicamente você só pode usar joinpoints de execução de método.
  • Aspectos não são aplicados ao chamar outro método dentro da mesma class.
  • Pode haver uma pequena sobrecarga de tempo de execução.
  • Spring-AOP não pode adicionar um aspecto a qualquer coisa que não seja criada pela fábrica da Spring

AspectJ Pros

  • Isso suporta todos os joinpoints. Isso significa que você pode fazer qualquer coisa.
  • Há menos sobrecarga de tempo de execução do que o Spring AOP.

AspectJ Cons

  • Seja cuidadoso. Verifique se os seus aspectos são tecidos apenas para o que você queria ser tecido.
  • Você precisa de um processo de construção extra com o AspectJ Compiler ou precisa configurar o LTW (tecelagem de tempo de carregamento)

Além do que os outros afirmaram – apenas para reformular, there are two major differences :

  1. Uma está relacionada ao tipo de tecelagem.
  2. Outro para a definição joinpoint.

Spring-AOP: Tempo de execução entrelaçado por proxy usando o conceito de dynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: Compile o tempo de tecer através do AspectJ Java Tools(ajc compiler) se houver fonte disponível ou pós tecelagem de compilation (usando arquivos compilados). Além disso, o tempo de carregamento com Spring pode ser ativado – ele precisa do arquivo de definição aspectj e oferece flexibilidade.

A tecelagem de tempo de compilation pode oferecer benefícios de desempenho (em alguns casos) e também a joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

O manual do usuário da primavera fornecerá muitas informações diretamente da boca do cavalo.

O capítulo 6.4 – Escolher qual estilo de declaração AOP usar está acabando para você, uma vez que discute os prós e contras de ambos.

O parágrafo 6.1.2 – Spring AOP Capabilities e objectives e capítulos 6.2 – @Aspect support e 6.8 – O uso do AspectJ com aplicativos Spring deve ser particularmente interessante.

Uma observação adicional: Se o desempenho sob carga alta for importante, você desejará o AspectJ, que é de 9 a 35 vezes mais rápido que o Spring AOP . 10ns vs 355ns podem não parecer muito, mas eu já vi pessoas usando LOTS of Aspects. 10K de aspectos. Nesses casos, sua solicitação pode atingir milhares de aspectos. Nesse caso, você está adicionando ms a essa solicitação.

Veja os benchmarks .

spring AOP é uma das partes essenciais da estrutura da primavera. No estágio básico, a estrutura da primavera é baseada em IoC e AOP. No curso oficial da spring há um slide em que diz:

O AOP é uma das partes mais importantes do framework.

O ponto chave para entender como funciona o AOP no Spring é que quando você escreve um Aspect com Spring nós instrumentamos o framework construindo um proxy para seus objects, com um JDKDynamicProxy se seu bean implementa uma interface ou via CGLIB se seu bean não implementa qualquer interface. Lembre-se de que você deve ter o cglib 2.2 em seu caminho de class se estiver usando o Spring antes da versão 3.2. A partir da spring 3.2, é inútil porque o cglib 2.2 foi incluído no núcleo.

A estrutura na criação do bean criará um proxy que envolve seus objects e adiciona responsabilidades de interesses transversais, como segurança, gerenciamento de transactions, registro e assim por diante.

A criação de proxy dessa maneira será aplicada iniciando por uma expressão pointcut que instrumenta a estrutura para decidir quais beans e methods serão criados como proxies. O conselho será mais responsável do que pelo seu código. Lembre-se que neste processo o pointcut captura apenas methods públicos que não são declarados como finais.

Agora, enquanto no Spring AOP a tecelagem de Aspects será executada pelo container na boot do container, no AspectJ você terá que fazer isso com uma compilation posterior do seu código através da modificação do bytecode. Por essa razão, na minha opinião, a abordagem da Spring é mais simples e mais gerenciável do que a AspectJ.

Por outro lado, com o Spring AOP você não pode usar todo o poder do AOP porque a implementação é feita através de proxies e não através da modificação do seu código.

Como em AspectJ, você pode usar a tecelagem de tempo de carregamento no SpringAOP. Você pode se beneficiar deste recurso na primavera é implementado com um agente e configurações especiais, @EnabledLoadWeaving ou em XML. Você pode usar o espaço de nome como exemplo. No entanto, no Spring AOP você não pode interceptar todos os casos. Por exemplo, o new comando não é suportado no Spring AOP.

No entanto, no Spring AOP você pode se beneficiar do uso do AspectJ através do uso do aspectof método factory no bean de configuração de spring.

A razão pela qual o Spring AOP é basicamente um proxy criado a partir do contêiner, portanto, você pode usar o AOP apenas para beans de primavera. Enquanto na AspectJ você pode usar o aspecto em todos os seus grãos. Outro ponto de comparação é o debug e a previsibilidade do comportamento do código. Com o Spring AOP, o job é pré-formado a partir do compilador Java e os aspectos são uma maneira muito interessante de criar um proxy para o Spring bean. No AspectJ, se você modificar o código, precisará de mais compilações e entender onde seus aspectos são tecidos pode ser difícil. Até mesmo desligar a tecelagem na primavera é mais simples: com a mola você remove o aspecto da sua configuração, reinicia e funciona. No AspectJ você deve recompilar o código!

Na tecelagem de carga, o AspectJ é mais flexível que o Spring porque o Spring não suporta todas as opções do AspectJ. Mas na minha opinião Se você quiser alterar o processo de criação de um bean, uma maneira melhor é gerenciar o login customizado em uma fábrica e não com a tecelagem de tempo de carregamento de um aspecto que altera o comportamento de seu novo operador.

Espero que esta panorâmica do AspectJ e Spring AOP ajude você a entender a diferença das duas poções

É importante considerar se seus aspectos serão críticos para a missão e onde seu código está sendo implantado. Spring AOP significará que você está confiando na tecelagem de tempo de carregamento. Isso pode não funcionar e, na minha experiência, isso significa que erros registrados podem existir, mas não impedirão que o aplicativo seja executado sem código de aspecto [Eu acrescentaria a ressalva de que é possível configurá-lo de tal forma que este não seja o caso; mas eu não estou pessoalmente ciente disso ]. A tecelagem em tempo de compilation evita isso.

Além disso, se você usar o AspectJ em conjunto com o aspectj-maven-plugin, poderá executar testes de unidade em relação aos seus aspectos em um ambiente de IC e ter certeza de que os artefatos criados serão testados e corretamente tecidos. Embora certamente você possa escrever testes de unidade acionados pelo Spring, ainda não há garantia de que o código implantado será aquele que foi testado se o LTW falhar.

Outra consideração é se você está hospedando o aplicativo em um ambiente onde é possível monitorar diretamente o sucesso ou a falha de uma boot de servidor / aplicativo ou se o aplicativo está sendo implantado em um ambiente em que não está sob sua supervisão [por exemplo, onde é hospedado por um cliente]. Novamente, isso indicaria o caminho para compilar a tecelagem do tempo.

Cinco anos atrás, eu era muito mais a favor do Spring configurado como AOP pela simples razão de que era mais fácil trabalhar com ele e menos propenso a mastigar meu IDE. No entanto, à medida que o poder de computação e a memory disponível aumentaram, isso se tornou muito menos um problema, e o CTW com o aspectj-maven-plugin tornou-se uma opção melhor no meu ambiente de trabalho, com base nas razões que descrevi acima.

Intereting Posts