Cuando se trata de AOP, definitivamente pensarás en la primavera porque esta cosa es demasiado poderosa. Pero debe tener claro que AOP es una idea de programación, y Spring es solo una implementación de AOP.
Primero, Baidu:
En la industria del software, AOP es la abreviatura de la programación orientada a los aspectos, lo que significa: una tecnología que implementa el mantenimiento unificado de las funciones del programa a través de métodos de precompilación y agentes dinámicos durante el tiempo de ejecución. AOP es una continuación de OOP, un tema candente en el desarrollo de software, una parte importante del marco de Spring y un paradigma derivado de la programación funcional. Las diversas partes de la lógica comercial se pueden aislar mediante el uso de AOP, reduciendo así el acoplamiento entre las diversas partes de la lógica comercial, mejorando la reutilización del programa y mejorando la eficiencia del desarrollo.
Hoy, usemos el proxy nativo de Java para implementar funciones simples de AOP.
Primero, debe conocer el conocimiento básico de reflexión, de lo contrario puede sentirse confundido.
No más palabras, solo comienza a escribir
Primero, escribamos una interfaz simple. El nombre es AnimalInterface, que se utiliza para declarar algunos métodos básicos para regular los animales.
Estos métodos incluyen establecer nombres, obtener nombres, llamamientos y atributos (perdóname por no ser educado, de hecho, es obtener si es terrestre, acuático o anfibio)
paquete proxy.imp; public interfaz AnimalInterface {// Establecer el nombre void setName (nombre de cadena); // Obtener la cadena de nombre getName (); // llamar nulo dice (); // Obtener el vacío permanente getProperty ();}Luego implementamos esta interfaz y creamos un perro llamado Xiao Hei
paquete proxy; import proxy.imp.animalInterface; public class Dogimp implementa animalInterface {private String name = "xiaohei"; public dogimp () {} @Override public void setName (nombre de cadena) {this.name = name; } @Override public String getName () {return this.name; } @Override public void Says () {System.out.println ("Puppy: lana de lana de lana ......"); } @Override public void getProperty () {System.out.println ("El cachorro es un animal terrestre, pero puede nadar"); }} Todos deben estar impacientes por realizar funciones de AOP ...
Primero creemos una clase llamada Aophandle para implementar la interfaz InvocationHandler. Cuando no puede usar Invoke, proxy como parámetro de reflexión, porque la interfaz del objeto proxy es diferente de un objeto, este mecanismo de proxy está orientado a la interfaz en lugar de orientarse a la clase. Si usa proxy, causará una recursión infinita. Luego está el desbordamiento de la pila, pero aún puede reflejarse con éxito una vez. Esto muestra que el objeto proxy y el proxy del objeto son diferentes. Sin embargo, podemos obtener el objeto de clase a través de proxy.getClass () del parámetro proxy, y luego obtener los métodos y parámetros de la clase proxy. Esto también proporciona un método de implementación para inyección de anotación, inyección de método específico e inyección de atributos. Hablemos de esto más tarde.
paquete proxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; public class aOphandle implementa InvocationHandler {// Guardar objeto objeto privado o; public aophandle (objeto o) {this.o = o; } /*** Este método se llamará automáticamente, Java Dynamic Proxy Mecanismo* se pasará en el siguiente parámetro* @param Object proxy La interfaz del objeto proxy, diferente del objeto* @param método método llamado método *param objeto [] parámetros del método* cuando no puede usar invocar, proxy como parámetro de reflexión, porque la interfaz de interfaz del proxy es diferente del objeto args de los parámetros de args*. Este mecanismo de proxy está orientado a la interfaz, no orientado a clases **/@Override Public Object Invoke (Object Proxy, Method Method, Object [] args) lanza l. // Imprime el nombre del método System.err.println ("Método de ejecución:"+método.getName ()+"n tipo de parámetro es:"); // Imprima el parámetro para (tipo de clase: método.getParametertypes ()) System.err.println (type.getName ()); // Imprima el tipo de retorno System.err.println ("Tipo de datos de retorno:"+Method.getReturnType (). GetName ()); // Método de llamadas de reflexión ret = Method.Invoke (O, args); // declarar el sistema final.err.println ("End de ejecución de métodos"); // Devuelve el valor de retorno del método de llamada reflexiva return Ret; }}El proxy dinámico se ha completado ... y luego nuestra factor de animales ... y continuemos
paquete proxy; import java.lang.reflect.proxy; public class AnimalFactory { /**** Get Object Method* @param obj* @return* /private static object getAnimalBase (object obj) {// get proxy object return proxy.newproxyInInstance (obj.getClassSsss (). nuevo Aophandle (obj)); } / **** Get Object Method* @param obj* @return* / @supesswarnings ("sin verificar") public static t getAnimal (object obj) {return (t) getanimalbase (obj); } / **** Get Object Method* @param classname* @return* / @supplreswarnings ("sin verificar") public static t getAnimal (string className) {object obj = null; intente {obj = getAnimalBase (class.forname (classname) .newinstance ()); } catch (Exception e) {E.PrintStackTrace (); } return (t) obj; } / **** Get Object Method* @param clz* @return* / @supesswarnings ("sin verificar") public static t getAnimal (class clz) {object obj = null; intente {obj = getanimalbase (clz.newinstance ()); } catch (Exception e) {E.PrintStackTrace (); } return (t) obj; }} Finalmente es el final ... ¿Qué falta? Ven aquí para ver el efecto ...
Jaja ... camarero, serviré ... oh ~ no, es una categoría de prueba ... jaja ///
paquete proxy; import org.junit.test; import org.junit.runner.runwith; import org.junit.runners.blockjunit4classrunner; import proxy.animalFactory; import proxy.imp.animalinterface; @runwith (blockjUnit4classrunner.class) público aoPestest Test1 () {animalInterface Dog = animalFactory.getAnimal (dogimp.class); dog.say (); System.out.println ("Mi nombre es"+dog.getName ()); dog.setName ("Ergouzi"); System.out.println ("Mi nombre es"+dog.getName ()); }} ¿Qué? ¿Qué, al final, esto es útil, no es un truco? Solo captura esto, ¿de qué sirve ...
¿Qué tipo de AOP, por qué no veo ningún AOP, cómo puedo ingresar el método personalizado? ¿Solo una entrada de sistema y engañar a la audiencia en esto? ...
Ok, sigamos adelante y vamos cómo implementar el método personalizado inyectado ...
Primero, agregue una interfaz, llamémosla interfaz de inyección AOP. Nombrarlo aopmethod
Crear métodos después y antes, recibir proxy de objeto, método método, objeto [] parámetros args
Esto hará más cosas ... Por ejemplo, antes de ejecutar el método, registrar el estado de la clase, escribir el registro. Monitorear la variable xx ,,,
Abre tu cerebro.
paquete proxy.imp; import java.lang.reflect.method; interfaz pública aopmethod {// método ejecutado antes de que el método de instancia se ejecute sin (objeto proxy, método método, objeto [] args); // Método ejecutado después de que el método de instancia se ejecute sin antes (proxy de objeto, método método, objeto [] args);} Luego modifique la clase Aophandle y agregue la propiedad AOPMethod.
Modifique el método del constructor para obtener una instancia de AOPMethod cuando la inicialización de la clase.
Finalmente, modifique el método de invocación ... vaya al código directamente
paquete proxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import proxy.imp.aopmethod; public class aOphandle implementa invocationHandler {// Guardar objeto privado Método AOPMethod; objeto privado o; público aophandle (objeto o, método aopmethod) {this.o = o; this.method = método; } /*** Este método se llamará automáticamente, Java Dynamic Proxy Mecanismo* El siguiente parámetro se pasará en* @param Object Proxy La interfaz de la interfaz del objeto proxy es diferente del objeto* @param método método llamado método @param objeto [] parámetros del método de proxy* cuando se puede utilizar el mechón proxy de proxy. orientado a la interfaz, no orientado a clases **/ @Override Public Object Invoke (Object Proxy, Method Method, Object [] Args) lanza {objeto retir = null; // El lugar de modificación está aquí este.method.before (proxy, método, args); ret = Method.Invoke (O, args); // El lugar de modificación está aquí this.method.After (proxy, método, args); regreso de regreso; }} Huhu, la tarea se hace, parece que todo es un problema, lindo ...
Actualizar la clase de prueba ahora ...
paquete proxy; import java.lang.reflect.method; import org.junit.runner.runwith; import org.junit.runners.blockjunit4classrunner; import proxy.imp.aopmethod; import proxy.animalinterface; @runwith (blockjunit4classrunner.class) static void main (string [] args) {animalInterface dog = animalFactory.getAnimal (dogimp.class, new aopmethod () {// Aquí está el método de corte AOP antes del método ejecutivo public void antes (objeto proxy, método método, objeto [] {system.err.println ("estoy en" + método Método AOP Método después de la ejecución del método Public void After (Object Proxy, Método del método, objeto [] args) {System.err.println ("Estoy en" + Method.getName () + "Ejecutar la ejecución del método"); dog.say (); String name1 = "Mi nombre es" + dog.getName (); System.out.println (name1); dog.setName ("Ergouzi"); String name2 = "Mi nombre es"+dog.getName (); System.out.println (name2); }} Huhu, querido, ¿tienes ganas de inyectar? ¿Sientes que has cortado tu propio método en él? Ja ja…
Parece que todo es perfecto, pero siempre siento que falta algo. Oh, sí, hay una falta de archivos de configuración como Spring.
De hecho, esos ya son muy simples. Dejémoslos a ti. Simplemente diseñe el formato XML y espera, ¿qué dices? ¿No puedes interceptar métodos personalizados?
¿No puede interceptar métodos personalizados como Spring? Oh ~~ no, de hecho, puede usar el método y el nombre de método para hacer un juicio antes (proxy de objeto, método método, objeto [] args) para usar el método y dar el nombre de método.
Por supuesto, este ejemplo no tiene un significado práctico, y no se puede comparar con varios marcos AOP perfectos. Este artículo solo le proporciona una forma de pensar, pero debe recordar que no importa cuán increíbles sean las cosas, se acumulan poco a poco
Descarga de ejemplo: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.