Tenho a impressão de que o Spring AOP é melhor usado para tarefas específicas de aplicativos, como segurança, log, transações, etc., pois usa anotações Java5 personalizadas como estrutura. No entanto, o AspectJ parece ser mais amigável quanto aos padrões de design.
Alguém pode destacar os vários prós e contras do uso do Spring AOP vs AspectJ em um aplicativo Spring?
java
spring
design-patterns
aspectj
spring-aop
babydudecoder
fonte
fonte
Respostas:
Profissionais do Spring-AOP
É mais simples de usar que o AspectJ, já que você não precisa usar LTW ( tecelagem em tempo de carregamento ) ou o compilador AspectJ.
Ele usa o padrão Proxy e o padrão Decorator
Contras Spring-AOP
AspectJ Pros
AspectJ Cons
fonte
If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
Além do que os outros afirmaram - apenas para reformular
there are two major differences
:Spring-AOP: tempo de execução de tecelagem através de proxy usando o conceito de
dynamic proxy if interface exists or cglib library if direct implementation provided.
AspectoJ: Tempo de compilação
AspectJ Java Tools(ajc compiler)
se a fonte estiver disponível ou pós-compilação (usando arquivos compilados). Além disso, a tecelagem do tempo de carregamento com o Spring pode ser ativada - ele precisa doaspectj
arquivo de definição e oferece flexibilidade.A tecelagem em tempo de compilação 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.
fonte
Uma observação adicional: se o desempenho sob alta carga for importante, você desejará o AspectJ que é 9 a 35x mais rápido que o Spring AOP . 10ns vs 355ns pode não parecer muito, mas já vi pessoas usando MUITOS Aspectos. 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 .
fonte
O manual do usuário da primavera fornecerá muitas informações diretamente da boca do cavalo.
O capítulo 6.4 - Escolhendo qual estilo de declaração de AOP usar está morto para você, uma vez que discute os prós e contras de ambos.
O parágrafo 6.1.2 - Recursos e objetivos da AOP do Spring e capítulos 6.2 - Suporte ao @Aspect e 6.8 - O uso do AspectJ com aplicativos Spring deve ser particularmente interessante.
fonte
Spring AOP é uma das partes essenciais da estrutura da primavera. No estágio muito básico, a estrutura da primavera é baseada em IoC e AOP. No curso oficial da primavera, há um slide no qual diz:
O ponto principal para entender como a AOP no Spring funciona é que, quando você escreve um Aspect com Spring, instrumentamos a estrutura com a construção de um proxy para seus objetos, com a
JDKDynamicProxy
se o seu bean implementa uma interface ou via CGLIB se o seu bean não implementa nenhum interface. Lembre-se de que você deve ter o cglib 2.2 em seu caminho de classe se estiver usando o Spring anterior à versão 3.2. A partir do 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 agrupa seus objetos e adiciona responsabilidades de preocupações transversais, como segurança, gerenciamento de transações, registro e assim por diante.
A criação de proxy dessa maneira será aplicada a partir de uma expressão pointcut que instrui a estrutura a decidir quais beans e métodos serão criados como proxies. O conselho será mais responsável do que pelo seu código. Lembre-se de que, neste processo, o pointcut captura apenas métodos públicos que não são declarados como finais.
Agora, enquanto no Spring AOP, a tecelagem de Aspectos será realizada pelo contêiner na inicialização do contêiner, no AspectJ você deve fazer isso com uma pós-compilação do seu código através da modificação do bytecode. Por esse motivo, na minha opinião, a abordagem Spring é mais simples e mais gerenciável 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 por meio de proxies e não pela modificação do seu código.
Como no AspectJ, você pode usar a tecelagem em tempo de carregamento no SpringAOP. Você pode se beneficiar desse recurso na primavera, implementada com um agente e configurações especiais
@EnabledLoadWeaving
ou em XML. Você pode usar o espaço para nome como um exemplo. No entanto, no Spring AOP, você não pode interceptar todos os casos. Por exemplo, onew
comando não é suportado no Spring AOP.No entanto, no Spring AOP, você pode se beneficiar do uso do AspectJ usando o
aspectof
método de fábrica no bean de configuração do Spring.Pelo motivo de o Spring AOP ser basicamente um proxy criado a partir do contêiner, você pode usar o AOP apenas para spring beans. Enquanto estiver com o AspectJ, você pode usar o aspecto em todos os seus grãos. Outro ponto de comparação é a depuração e a previsibilidade do comportamento do código. Com o Spring AOP, o trabalho é pré-formado todo no compilador Java e os aspectos são uma maneira muito legal de criar proxy para o seu bean Spring. No AspectJ, se você modificar o código, precisará de mais compilação e entender onde seus aspectos estão entrelaçados pode ser difícil. Mesmo desligar a tecelagem na primavera é mais simples: com a primavera, você remove o aspecto da sua configuração, reinicia e funciona. No AspectJ, você deve recompilar o código!
Na tecelagem em tempo de carregamento, 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ê deseja alterar o processo de criação de um bean, a melhor maneira é gerenciar o logon personalizado em uma fábrica e não com a tecelagem em tempo de carregamento de um aspecto que altera o comportamento do seu novo operador.
Espero que esta panorâmica do AspectJ e do Spring AOP ajude você a entender a diferença das duas poções
fonte
É importante considerar se seus aspectos serão de missão crítica e onde seu código está sendo implantado. O Spring AOP significa que você depende da tecelagem em tempo de carregamento. Isso pode falhar em tecer e, na minha experiência, significa que podem existir erros registrados, mas não impedirão a execução do aplicativo sem o código de aspecto [eu acrescentaria a ressalva de que talvez seja possível configurá-lo de tal maneira que esse não seja o caso; mas eu não estou pessoalmente ciente disso ]. A tecelagem em tempo de compilação 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 confiança de que os artefatos construídos são testados e tecidos corretamente. Embora você possa certamente escrever testes de unidade acionados por Spring, você ainda não tem garantia de que o código implementado será aquele que foi testado se o LTW falhar.
Outra consideração é se você está hospedando o aplicativo em um ambiente em que é capaz de monitorar diretamente o sucesso ou falha de uma inicialização de servidor / aplicativo ou se o aplicativo está sendo implementado em um ambiente em que não está sob sua supervisão [por exemplo, onde é hospedado por um cliente]. Novamente, isso apontaria o caminho para compilar o tempo de tecelagem.
Há cinco anos, eu era muito mais favorável à AOP configurada pelo Spring pelo simples motivo de que era mais fácil trabalhar com e menos provável de mastigar meu IDE. No entanto, à medida que o poder de computação e a memória disponível aumentam, isso se torna muito menos problemático e a CTW com o aspectj-maven-plugin se tornou uma escolha melhor no meu ambiente de trabalho com base nos motivos que descrevi acima.
fonte
Este artigo também tem uma boa explicação sobre o tópico.
fonte
Comparado ao AOP, o AspectJ não precisa aprimorar a classe de destino no momento da compilação. Em vez disso, ele gera uma classe de proxy para a classe de destino no tempo de execução, que implementa a mesma interface que a classe de destino ou é uma subclasse da classe de destino.
Em resumo, uma instância de uma classe proxy pode ser usada como uma instância de uma classe de destino. Em geral, a estrutura AOP aprimorada em tempo de compilação é mais vantajosa em desempenho - porque a estrutura AOP aprimorada em tempo de execução requer aprimoramentos dinâmicos toda vez que é executada.
fonte