Quando se trata de AOP, você definitivamente pensará na primavera porque essa coisa é poderosa demais. Mas você deve estar claro que a AOP é uma ideia de programação, e a primavera é apenas uma implementação da AOP.
Primeiro, Baidu:
Na indústria de software, a AOP é a abreviação da programação orientada para aspectos, o que significa: uma tecnologia que implementa a manutenção unificada das funções do programa por meio de métodos de pré -compilação e agentes dinâmicos durante o tempo de execução. AOP é uma continuação da OOP, um tópico quente no desenvolvimento de software, uma parte importante da estrutura da primavera e um paradigma derivado de programação funcional. As várias partes da lógica de negócios podem ser isoladas usando a AOP, reduzindo assim o acoplamento entre as várias partes da lógica de negócios, melhorando a reutilização do programa e melhorando a eficiência do desenvolvimento.
Hoje, vamos usar o proxy nativo do Java para implementar funções simples da AOP.
Primeiro, você precisa conhecer o conhecimento básico de reflexão, caso contrário, poderá se sentir confuso.
Não há mais palavras, apenas comece a digitar
Primeiro, vamos escrever uma interface simples. O nome é AnimalInterface, que é usado para declarar alguns métodos básicos para regular os animais.
Esses métodos incluem definir nomes, obter nomes, chamados e atributos (perdoe -me por não ser educado, de fato, é para obter se é terrestre ou aquático ou anfíbio)
pacote proxy.imp; interface pública AnimalInterface {// Defina o nome void setName (nome da string); // Obtenha o nome String getName (); // Call void diz (); // Obtenha o vazio permanente getProperty ();}Em seguida, implementamos esta interface e criamos um cachorro chamado Xiao Hei
Proxy do pacote; importar proxy.imp.animalinterface; public class DogImp implementa AnimalInterface {private string name = "xiaohei"; public DogImp () {} @Override public void setName (nome da string) {this.name = name; } @Override public string getName () {return this.name; } @Override public void diz () {System.out.println ("Puppy: lã de lã ......"); } @Override public void getProperty () {System.out.println ("Puppy é um animal terrestre, mas pode nadar"); }} Todos devem estar impacientes para realizar funções semelhantes à AOP ...
Vamos primeiro criar uma classe chamada AOphandle para implementar a interface InvocationHandler. Quando você não pode usar o Invoke, proxy como parâmetro de reflexão, porque a interface do objeto proxy é diferente de um objeto, esse mecanismo de proxy é orientado a interface em vez de orientado a classe. Se você usar proxy, isso causará recursão infinita. Depois, há um transbordamento de pilha, mas ainda pode refletir com sucesso uma vez. Isso mostra que o objeto proxy e o proxy do objeto são diferentes. No entanto, podemos obter o objeto de classe através do proxy.getClass () do parâmetro proxy e, em seguida, obter os métodos e parâmetros da classe proxy. Isso também fornece um método de implementação para injeção de anotação, injeção específica de método e injeção de atributo. Vamos falar sobre isso mais tarde.
Proxy do pacote; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; classe pública aOphandle implementa InvocationHandler {// Salvar objeto Private Object O; public aophandle (objeto o) {this.o = o; } /*** Este método será chamado automaticamente, o mecanismo de proxy dinâmico Java* será passado no seguinte parâmetro* @param objeto proxy A interface do objeto proxy, diferente do objeto* @param método chamado método* @param objeto [] argumenta os parâmetros* quando você não pode usar, proxy como parâmetro de reflexão. Esse mecanismo de proxy é orientado a interface, não orientado a classe **/@Override Public Object Invoke (proxy do objeto, método do método, objeto [] args) lança arremesso {// Método Valor Object ret = null; // Nome do método de impressão System.err.println ("Método de execução:"+method.getName ()+"N Tipo de parâmetro é:"); // Print Parâmetro para (Tipo de classe: Method.getParameterTypes ()) System.err.println (type.getName ()); // Print Return Type System.err.println ("Retorno Tipo de dados:"+Method.getRettyType (). GetName ()); // Método de chamada de reflexão ret = métod.invoke (O, args); // Declare o final do sistema.err.println ("Execução do método final"); // retorna o valor de retorno do método de chamada reflexivo retorna ret; }}O proxy dinâmico foi concluído ... e depois nossa fábrica animal ... e vamos continuar
Proxy do pacote; importar java.lang.reflect.proxy; public class AnimalFactory { /**** Obtenha o método do objeto* @param obj* @return* /objeto estático privado getanimalbase (object obj) {// obt proxy objeto de retorno proxy.wproxyInstance (ob.getcll). novo aophandle (obj)); } / **** Obtenha o método do objeto* @param obj* @return* / @suppresswarnings ("desmarcado") public static t getanimal (objeto obj) {return (t) getanimalbase (obj); } / **** Obtenha o método do objeto* @param className* @return* / @suppresswarnings ("desmarcado") public static t getanimal (string className) {objeto obj = null; tente {obj = getAnimalbase (class.formoname (className) .NewInstance ()); } catch (Exceção e) {e.printStackTrace (); } retornar (t) obj; } / **** Obtenha o método do objeto* @param clz* @return* / @suppresswarnings ("desmarcado") public static t getanimal (classe clz) {objeto obj = null; tente {obj = getAnimalbase (clz.newInstance ()); } catch (Exceção e) {e.printStackTrace (); } retornar (t) obj; }} Finalmente é o fim ... o que está faltando? Venha aqui para ver o efeito ...
Haha ... garçom, eu vou servir ... oh ~ não, é uma categoria de teste ... haha ///
pacote proxy; importar org.junit.test; importar org.junit.runner.runwith; importar org.junit.runners.blockjunit4classrunner; import proxy.animalFactory; import proxy.imp.animalinterface; @runwith (junitSlactory; proxy.imnner.Inimalinterface; @runwith (restrdenClattorn; Test1 () {AnimalInterface Dog = AnimalFactory.getAnimal (DogImp.class); Dog.Say (); System.out.println ("Meu nome é"+Dog.getName ()); cachorro.setName ("ergouzi"); System.out.println ("Meu nome é"+Dog.getName ()); }} O que? O que, no final, isso é útil, isso não é um truque? Basta capturar essa coisa, qual é o uso ...
Que tipo de AOP, por que não vejo AOP, como posso entrar no método personalizado? Apenas uma entrada de syso e enganar o público nisso?….
OK, então vamos em frente e ver como implementar o método personalizado injetado ...
Primeiro, adicione uma interface, vamos chamá -lo de interface de injeção de AOP. Nomeie -o AOPMETHOD
Crie métodos depois e antes, receba proxy de objeto, método do método, objeto [] ARGS Parâmetros
Isso fará mais coisas ... por exemplo, antes de executar o método, gravar o status da classe, escreva o log. Monitore a variável xx ,,,
Abra seu cérebro.
pacote proxy.imp; importar java.lang.reflect.method; interface pública AOPMETHOD {// Método executado antes do método da instância ser executado vazio após (proxy do objeto, método do método, objeto [] args); // Método executado após o método da instância ser executado nulo antes (proxy do objeto, método do método, objeto [] args);} Em seguida, modifique a classe AOphandle e adicione a propriedade AOPMETHOD.
Modifique o método do construtor para obter uma instância AOPMETHOD quando a inicialização da classe.
Finalmente modifique o método de invocar ... vá para o código diretamente
Proxy do pacote; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; importar proxy.imp.aopmethod; classe pública aOphandle implementa a InvocationHandler {// Salvar objeto Private AOPMETHOD Método; objeto privado o; AOPHADLE Public (objeto O, método AOPMETHOD) {this.o = O; this.method = método; } /** * This method will be called automatically, Java dynamic proxy mechanism* The following parameter will be passed in * @param Object proxy The interface of the proxy object is different from the object* @param Method method called method* @param Object[] args method parameters* When invoke cannot be used when proxy is used as a reflection parameter, because the interface of the proxy object is different from object* This proxy mechanism é orientado a interface, não orientado a classe **/ @Override Public Object Invoke (proxy do objeto, método do método, objeto [] args) lança jogável {objeto ret = null; // O local de modificação está aqui. ret = métod.invoke (o, args); // O local de modificação está aqui. retornar retorno; }} Huhu, a tarefa é feita, parece que tudo é um problema, fofo ...
Atualize a classe de teste agora ...
Proxy do pacote proxy; importar org.junit.runner.runwith; importar org.junit.runners.blockjunit4classrunner; @trunwith.imp.aopmethod; importRuniNit.crunIniMoPl; estático void main (string [] args) {AnimalInterface Dog = AnimalFactory.getAnimal (DogImp.class, new AOPMETHOD () {// aqui está o método de corte AOP antes da execução do método public void antes do método do método, me método, (args) {System.err.Println ("I'm in" I'm in " + no método" +. é o método de corte da AOP após a execução do método public void após (proxy de objeto, método, objeto [] args) {System.err.println ("Estou em" + method.getName () + "Execute após a execução do método"); Dog.Say (); String name1 = "Meu nome é" + Dog.getName (); System.out.println (nome1); cachorro.setName ("ergouzi"); String name2 = "Meu nome é"+Dog.getName (); System.out.println (nome2); }} Huhu, querida, você sente vontade de injetar? Você sente que cortou seu próprio método ??? Haha…
Parece que tudo está perfeito, mas sempre sinto que algo está faltando? Ah, sim, há uma falta de arquivos de configuração como o Spring.
De fato, esses já são muito simples. Vamos deixá -los para você. Basta projetar o formato XML e esperar, o que você diz? Você não pode interceptar métodos personalizados?
Não pode interceptar métodos personalizados como a primavera? Oh ~~ Não, na verdade, você pode usar o método e o nome do método para fazer um julgamento antes (proxy do objeto, método do método, objeto [] args) para usar o método e fornecer o nome do método.
Obviamente, este exemplo não tem significado prático e não pode ser comparado com várias estruturas perfeitas da AOP. Este artigo fornece apenas uma maneira de pensar, mas você deve lembrar que, por mais impressionantes que sejam as coisas, elas são acumuladas pouco a pouco
Exemplo Download: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.