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:
A AOP é uma das partes mais importantes da estrutura.
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, o new
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