AOP, creo que todos son muy claros. A veces necesitamos procesar algunos registros de solicitudes, o monitorear algunos métodos, y ¿qué debe manejarse si hay excepciones? Ahora, presentamos AOP de Spring-Boot.
[Entorno de desarrollo: el número de versión JDK es 1.8, Spring
El número de versión de arranque es 1.4.1] {style = ”Color de fondo:#FF0000”}
Primero, presentaremos primero el paquete JAR.
El archivo POM se agrega de la siguiente manera:
< <Versión> 2.7 </versión> </pendency>
Después de introducir el paquete JAR, agregamos dos métodos de procesamiento de solicitudes simples para iniciar el inicio:
@SpringBootApplication (ScanBasePackages = {"com"})@RestControllerPublic DemoApplication {public static void main (string [] args) {springApplication.run (demoApplication.class, args); } // Pruebe una solicitud GET sin argumentos @RequestMapping (valor = "/testAspect", método = requestmethod.get) public Uservo test () {uservo uservo = new Uservo (); uservo.setage ("23"); uservo.setName ("él xiaowu"); uservo.setsex ("macho"); regresar Uservo; } // Pruebe la solicitud GET con parámetros, deje que AOP imprima el contenido de parámetros @RequestMapping (value = "/testAspectargs", método = requestmethod.get) test pública uservo (nombre de cadena, edad de cadena, sexo de cadena) {uservo uservo = new uservo (); uservo.setName (nombre); uservo.setage (edad); uservo.setsex (sexo); regresar Uservo; }Después de agregar dos métodos simples de procesamiento de solicitudes, agregamos nuestro AOP
/** * Nombre del proyecto: SpringBootDemo * Creador: He Xiaowu * Tiempo de creación: 16/12/4 7:05 PM * Nombre de clase: AspectoDemo * Descripción de la clase: * /// Declare es una sección@aspecto // declarar es un bean@componente@componente@orden (1) de clase pública de aspecto público {logger log = logger.getLogger (getClass ()); privado gson gson = new Gson (); // Declarar un punto en la expresión de ejecución @PointCut ("Ejecution (public * com.example.demoApplication. * (..))") privado void controleraSpect () {} // imprima el contenido antes de solicitar el método @BeFore (value = "ControlleraSpect ()") Public Void MethodBefe (unePointEnder) {ServletAtTributes Solicutes = " (ServLetRequestAttributes) requestContexTholder.getRequestatTributes (); HttpservletRequest request = requestAttributes.getRequest (); // Imprima el contenido de solicitud log.info ("========================================================= ================================================================ ================================================================ ====================================================================== ================================================================ ====================================================================== ================================================================ ====================================================================== // Imprima el contenido de retorno después de ejecutar el método @AfterReturning (returning = "o", pointCut = "controleraSpect ()") public void MethodafterReturning (objeto o) { log.info ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------Después de configurar los dos, solicitamos y luego vemos el registro de impresión. Primero, inicie nuestro contenedor y luego solicitamos primero el método de procesamiento parametrizado. El registro de impresión es el siguiente:
{width = "1232"
altura = "132"}
Se puede encontrar que la URL solicitada, el método, los valores de los parámetros ARG, los tipos y el contenido devuelto se imprimen, lo que indica que esta es la intercepción de AOP con éxito.
A continuación, probamos el método de procesamiento de solicitudes sin parámetros e imprimimos el registro de la siguiente manera:
{width = "1100"
altura = "130"}
Podemos encontrar que los parámetros del método impresos en este método son una matriz vacía porque el método no requiere pasar el parámetro.
Lo anterior es SpringBoot References AOP para el procesamiento de registro del procesamiento web. Aquí hay algunas anotaciones principales para las secciones de AOP. Las siguientes son solo descripciones y uso de las anotaciones. El autor no los probará en detalle. Si está interesado, puede probarlos usted mismo:
Anotación de clase:
@Spect Define una clase como una clase de aspecto
@order (i) marca la prioridad de procesamiento de la clase faceta. Cuanto más pequeño sea el valor I, mayor será el nivel de prioridad. PD: Puede anotar la clase o anotar el método.
Anotación del método:
@Pointcut define un método como un corte de punto como expresión, los siguientes detalles
@Antes de ejecutar el método antes del punto tangente, el contenido es el punto tangente especificado
@After se ejecuta después del corte del punto, antes de regresar,
@AfterReturning se ejecuta después del punto de entrada y regresa. Si desea procesar los parámetros de retorno de algunos métodos, puede operarlo aquí.
@Araund rodea el punto tangente, ejecute antes de ingresar al punto tangente, y después del punto tangente
@Afterthrowing lanza una excepción después del punto de hendidura para procesar
@order (i) marca la prioridad del corte de puntos. Cuanto más pequeño es el i, mayor será la prioridad
@Pointcut Annotation Combination:
En el código anterior, definimos un punto tangente que solo procesa la ruta especificada:
@PointCut ("Ejecution (public * com.example.demoapplication. * (..))") privado void controleraSpect () {}Ahora, estamos definiendo un punto tangente para manejar otras rutas:
@PointCut ("Ejecution (public*com.demo.*.*(..))") privado void controlerDemo () {}Los puntos tangentes anteriores se procesan por separado. Si necesitamos un punto tangente para procesarlos, podemos configurarlo así:
@PointCut (value = "ControllerSpect () || ControllerDemo ()") Private Void all () {} En la anotación @Pointcut, consulte directamente a otros nombres de métodos anotados por @Pointcut, para que el corte de puntos pueda manejar los métodos en dos rutas
@Pointcut Annotation Expression: public*com.demo.*.*(..)
El primer método de representación del modificador público puede usar * en lugar del primero * para representar el valor de retorno, y * representa todo
com.demo.* PAQUETA PAGA ,.* Representa el tercer paquete en la ruta.* Representa los métodos de todas las clases en todos los paquetes en la ruta.
(..) significa parámetros de método ilimitados
Algunas notas sobre @Order (i) anotación:
La clase de anotación, cuanto menor sea el valor, mayor es la prioridad, el método de anotación, las dos anotaciones se anotan: @before, más menor es el valor I, mayor es la prioridad, mayor es la prioridad, más anotadas: @after o @afterreturning, mayor es el valor i, mayor es la prioridad.
Para resumir los dos, es:
En la operación antes del punto de entrada, la operación después del punto de entrada se realiza mediante el valor de pedido de pequeño a grande, y la operación después del punto de entrada se realiza mediante el valor de pedido de gran a pequeño
extender:
Algunos lectores pueden preguntar, si quiero imprimir el tiempo requerido para la solicitud del entrante y el final, definir una variable de miembro para contar la hora y dar acceso a @before y @afterreturning, puede haber problemas de sincronización. Por lo tanto, nos referimos a un objeto TreveLocal que especifica el tipo genérico. El momento de registrar la solicitud en @before y deducir el registro en @afterreturning es el tiempo consumido. El código es el siguiente:
/** * Nombre del proyecto: SpringBootDemo * Creador: He Xiaowu * Tiempo de creación: 16/12/4 7:05 PM * Nombre de clase: AspectDemo * Descripción de la clase: * /// La declaración es una sección@aspecto // Declaration es un bean@componente@componente@orden (1) de clase pública de clase pública {logger log = logger.getlogger (getClass ()); privado gson gson = new Gson (); ThreadLocal <Long> starttime = new ThreadLocal <Long> (); // Declarar un punto en la expresión de ejecución @PointCut ("Ejecution (public * com.example.demoApplication. * (..))") privado void controleraSpect () {} // imprima el contenido antes de solicitar el método @BeFore (value = "ControlleraSpect ()") Public Void MethodBefe (se unePointEnder) {starttime.set (System.CurrentTimemElsEnt () "); ServLetRequestAttributes requestAttributes = (ServLetRequestatTributes) requestContexTholder.getRequestatTributes (); HttpservletRequest request = requestAttributes.getRequest (); // Imprima el contenido de solicitud log.info("=========================================================================================================== ===================================================================================================================== ===================================================================================================================== ============================================================= ============================================================= Arrays.ToString (unkePoint.getArgs ())); log.info("========================================================================================================== Arrays.ToString (unkePoint.getArgs ())); log.info ("Contenido de respuesta:" + gson.tojson (o)); log.info ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Los anteriores son todos los resultados obtenidos por mi prueba. Puede haber diferencias o errores. Por favor corríjeme.
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.