Visão geral
O módulo Spirng-AOP é o módulo principal na estrutura da mola. Embora o contêiner do IOC da primavera não depende da AOP, a AOP fornece uma solução poderosa e flexível para a implementação do COI.
Na estrutura da primavera, a AOP é usada principalmente para dois propósitos:
De uma perspectiva funcional, a AOP pode ser considerada um complemento ao método de programação OOP, fornecendo uma maneira diferente de código ou organização do sistema. O conceito central na OOP é a classe e na AOP é o aspecto.
O módulo Spirng-AOP é o módulo principal na estrutura da mola. Embora o contêiner do IOC da primavera não depende da AOP, a AOP fornece uma solução poderosa e flexível para a implementação do COI.
Na estrutura da primavera, a AOP é usada principalmente para dois propósitos:
A Spring AOP é implementada em Java Pure e não requer processamento especial de compilação e não requer controle da hierarquia do carregador de classe, para que possa ser usado para contêiner de servlet e outros servidores de aplicativos.
Atualmente, a Spring AOP suporta apenas comutação ou interceptação no nível do método e a interceptação de atributos não é suportada agora. Se você deseja interceptar atributos, considere usar o idioma de aspecto.
A Spring AOP é usada de maneira diferente da maioria das outras estruturas da AOP. Seu principal objetivo não é fornecer um conjunto grande e abrangente de implementações de AOP, mas integrar diferentes implementações da AOP e colaborar com o COI da primavera para ajudar a resolver alguns problemas comuns.
Deve-se notar que alguns recomendados com grão fino (como o modelo de domínio), a Spring AOP geralmente não fornece um bom suporte, e esse cenário ainda considera o aspecto. Mesmo assim, na experiência geral, o poderoso mecanismo da Spring AOP ainda pode resolver os problemas na maioria dos cenários.
Então, como devemos ver a Spring AOP e o aspecto, citando o texto original dos documentos oficiais de Spring:
A Spring AOP nunca lutará para competir com os aspectos para fornecer uma solução abrangente de AOP. Acreditamos que as estruturas baseadas em proxy, como a Spring AOP e as estruturas completas, como o aspecto, são valiosas e que estão completas, e não na competição. A primavera integra perfeitamente a Spring AOP e o COI ao AspectJ, para permitir que todos os usos da AOP sejam atendidos dentro de uma arquitetura de aplicativos baseada em primavera consistente. Essa integração não afeta a API da Spring AOP ou a API da AOP Alliance: Spring AOP permanece compatível com versões anteriores.
Em todos os projetos de módulos da estrutura da primavera, um dos princípios principais que sempre é respeitado é não invasivo.
Portanto, ao usar a Spring AOP, não nos forçaremos a introduzir classes ou interfaces específicas no código de negócios, o que pode manter o código limpo e dissipar na extensão máxima. No entanto, a Spring também oferece outra opção, se houver um cenário específico, você poderá introduzir diretamente o Spring AOP em seu código. Quase todos os módulos nas estruturas de primavera fornecerão uma variedade de opções da maneira como são usadas para que os usuários possam escolher uma maneira mais adequada para seus cenários. Use AspectJ ou Spring AOP, Use o método de anotação ou configuração XML, depende de U.
Depois de entender os cenários de intenção e uso originais da Spring AOP, vamos dar uma olhada em seu princípio de implementação geral
A maioria dos problemas no mundo do software pode ser resolvida adicionando uma camada.
A camada mencionada aqui é obviamente em um sentido amplo, que pode ser uma abstração ou um cache, o que significa aproximadamente a categoria de isolamento e desacoplamento.
No mundo da primavera, a introdução de cada módulo ou a integração de tecnologias de terceiros sempre fornecerá uma camada de abstração, fornecendo uma API unificada aos usuários, bloqueando todos os detalhes e diferenças de implementação entre diferentes implementações. Por exemplo, módulos como Spring-Cache, Spring-JDBC, Spring-JMS e Spirng-Messaging fornecem uma camada de abstração.
A implementação da Spring AOP é um mecanismo baseado em proxy, que usa proxy dinâmico do JDK por padrão, e também pode usar o proxy do CGLIB. A diferença entre os dois é principalmente a diferença entre os objetos que estão sendo proxiados. Quando o objeto de destino é uma interface, o proxy dinâmico do JDK pode concluir o proxy, mas quando o objeto de destino não implementa a classe de interface (tente ser menor, a programação orientada para a interface é um bom hábito), é necessário usar o proxy CGLIB para concluir o proxy. Obviamente, você também pode forçar a interface a usar o CGLIB como proxy; Além disso, quando tipos específicos precisam ser injetados ou referenciados, se o objeto referenciado for exatamente o objeto proxy, você também precisará usar o método CGLIB.
O design e implementação funcionais podem ser divididos em duas partes principais
Criação de AOP
A classe principal que gera o objeto proxy, proxyfactorybean getObject ()
A figura a seguir é a lógica de seleção de usar JDK ou CGLIB ao gerar um proxy:
Depois de encontrar o executor específico do agente de geração, quando essa operação é chamada? Aqueles que entenderam o ciclo de vida dos grãos de primavera devem saber que, quando um feijão é criado, há uma série de interfaces de retorno de chamada para os usuários inserirem comportamentos personalizados para influenciar algumas das características do feijão. BeanPostProcessor é uma das interfaces. Artigos anteriores foram introduzidos (a arma definitiva para brincar com grãos de primavera). A Spring AOP aproveitou essa oportunidade para inserir um truque no processo de criação de um feijão. Se o feijão que está sendo criado for o nosso alvo AOP, crie um proxy e finalmente retorne o objeto Proxy ao COI.
AbstractAutoProxycreator Esta classe é uma implementação do BEANPostProcessor, usada para criar um proxy, consulte o método de pós-processamento desse processador e, finalmente, retorna o proxy retornado pelo método CreateProxy ().
Execução aprimorada de seções AOP
Pode ser entendido como uma chamada para todas as cadeias interceptadoras no objeto de destino
Como existem duas implementações específicas do Spring AOP, o proxy dinâmico do JDK e o CGLIB, os métodos de execução de interceptores são diferentes. Para detalhes, você pode ler o código -fonte jdkdynamicaopproxy o método
A chamada para o método de destino baseia -se em refletivemethodinvocation.
O processamento do processo no refleteMethodinVocation usa o método recursivo para processar cadeias interceptadoras.
Método de interceptação de cglibaopproxy
O cglibmethodinvocation herda o refleteMethodinVocation, e o método Process () acima é usado para lidar com as cadeias interceptadoras.
Dois detalhes a serem observados ao usar a Spring AOP:
1. A Spring AOP não funciona ao chamar o método dentro da classe (auto-votos), porque a chamada interna não passa pelo objeto proxy e é usada diretamente. As soluções são:
2. Ao injetar feijão, se você quiser injetar o tipo específico de feijão em vez da interface, use CGLIB
A Spring AOP tem funções poderosas e design inteligente. O contexto principal é resolvido aqui e os detalhes não serão discutidos um por um.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.