Prefacio
AOP es la abreviatura de la programación orientada a los aspectos. Es un concepto que es opuesto a la programación orientada a objetos. En la programación orientada a objetos, tendemos a adoptar conceptos como encapsulación, herencia y polimorfismo para implementar cada función en el objeto. Sin embargo, en situaciones reales, también encontramos que existe otro requisito de que se necesite un tipo de función en muchos métodos de muchos objetos. Por ejemplo, algunos métodos para el acceso a la base de datos tienen requisitos de gestión de transacciones, y muchos métodos requieren registros de impresión. De una manera orientada a objetos, estas mismas funciones deben implementarse en muchos lugares o llamar en muchos lugares. Esto es muy engorroso y está demasiado cerca de estos requisitos independientes del negocio. Entonces, más tarde, la programación orientada a los aspectos parecía resolver este tipo de problema e hizo buenos suplementos para la programación orientada a objetos
concepto
Para comprender bien la programación orientada a tangentes, primero debe comprender algunos conceptos de AOP. En Java, SuppeJ implementa las funciones de AOP de una manera relativamente completa, pero también es más complejo de usar, por lo que aquí es principalmente discutir el AOP de Spring. Spring AOP adopta el principio de simplicidad y adecuación para realizar las funciones centrales de AOP. Hablemos primero sobre los conceptos específicos en AOP
Implementación de SprinBoot AOP
Hemos usado varios capítulos para describir el uso básico de Springboot. Entonces, aquí usamos SpringBoot y AOP para combinar para implementar una función de salida de todos los parámetros de entrada de la interfaz REST y registros de parámetros de devolución.
Implementar la función de servicio REST.
Según el artículo anterior, primero construiremos un proyecto SpringBoot como se muestra en la siguiente figura
proyecto de demostración
Configuración del proyecto SpringBoot
Configuramos los proyectos SpringBoot de la siguiente manera
Servidor: Puerto: 3030 Servlet: Context-Path: /AOP-Demospring: Jackson: Fecha Formato: A yyyy-MM-DD HH: MM: SS Serialización: Ejunte-salida: Truelogging: Nivel: Com.yanggch: Debug
La configuración relacionada con Jackson es emitir objetos a las cadenas JSON y formatear la salida.
Clase de controlador que implementa una interfaz REST
Aquí implementamos dos interfaces de descanso. Uno es devolver la información de Hello. Una es devolver la información de inicio de sesión en función de la entrada.
paquete com.yanggch.demo.aop.web; import com.yanggch.demo.aop.domain.loginentity; import com.yanggch.demo.aop.domain.securityEntity; import org.springframework.web.bind.annotation.pathvariable; import org. java.util.date;/*** Servicio de descanso relacionado con la seguridad** @author: yang gaochao* @since: 2018-05-27*/ @restcontroller @requestmapping ("/api/v1/seguridad") public class SecurityApi {@RequestMapping (valor = "/login/{thopid}", método = requestmethod.post) Login (@RequestBody Loginentity Loginentity, @PathVariable Long Shopid) {SecurityEntity SecurityEntity = new SecurityEntity (); SecurityEntity.setShopID (ShopID); SecurityEntity.SetAcCount (loginentity.getAccount ()); SecurityEntity.SetPwd (loginentity.getpwd ()); SecurityEntity.SetLogInTime (nueva fecha ()); devolver la atención de seguridad; } @RequestMapping (value = "/echo/{name}", método = requestmethod.get) public string login (@PathVariable String Name) {return "Hello," + Name; }}Primero, queremos generar los parámetros de entrada y devolver los resultados de todas las interfaces REST al registro a través de la función AOP.
Implementar funciones web de AOP.
paquete com.yanggch.demo.aop.comment; import com.fasterxml.jackson.databind.objectMapper; import org.spectj.lang.joinpoint; import og.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.bever; import org.slf4j.logger; import org.slf4j.loggerFactory; import org.springframework.beans.factory.annotation.aUtowired; import org.springframework.stereotype.component; import og.springfframework.web.multipart.multipartfile; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletresponse;/*** Interfaz web log** @author: yang gaochao* @since: 2018-05-27*/ @aspecto @componentpublic class wallgaspespect {logger logger logger logger = LoggerFactory.getLogger (webloGaspect.class); Mapeador privado final de ObjectMapper; @AUTOWIRED Public WebLogaspect (ObjectMapper Mapper) {this.mapper = mapper; } @PointCut (" @annotation (org.springframework.web.bind.annotation.requestMapping)") public void weblog () {} @bebefore ("weblog ()") public void doBeFore (unión de unión unión) {para (objeto objeto: unePoint.getargs ()) {if (object instance de multipartfile || HttpservletRequest || } try {if (log.isdeBugeNabled ()) {log.debug (unePoint.getTarget (). getClass (). getName () + "." + unión. }} catch (Exception e) {E.PrintStackTrace (); }}} @Afterreturning (returning = "respuesta", puntos = "weblog ()") public void doafterReturning (respuesta del objeto) lanza {if (respuesta! = Null) {log.debug ("parámetro de respuesta:" + mapper.writevalueasstring (respuesta)); }}}Aquí hay algunas cosas a las que prestar atención.
prueba
En primer plano, la solicitud se inicia a través de Postman, y el resultado de la entrada del registro de fondo es el siguiente
2018-05-27 19: 58: 42.941 Debug 86072 --- [NIO-3030-EXEC-4] C.Yanggch.Demo.Aop.comment.WebloGaspect: com.yanggch.demo.aop.web.securityapi.login: solicitar parámetro: {
"Cuenta": "Yanggch",
"PWD": "123456"
}
2018-05-27 19: 58: 42.941 Debug 86072 --- [NIO-3030-EXEC-4] C.Yanggch.Demo.Aop.comment.WebLogaspect: com.yanggch.demo.aop.web.securityapi.login: Solicitud de parámetro: 2001
2018-05-27 19: 58: 42.942 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COMMENT.WEBLOGASPECT: Parámetro de respuesta: {
"Shopid": 2001,
"Cuenta": "Yanggch",
"PWD": "123456",
"Logintime": "2018-05-27 11:58:42"
}
2018-05-27 19: 58: 45.796 Debug 86072 --- [NIO-3030-EXEC-5] C.Yanggch.Demo.aop.comment.WebloGaspect: com.yanggch.demo.aop.web.securityapi.eco: solicitar parámetro: "Yanggch"
2018-05-27 19: 58: 45.796 DEBUG 86072 --- [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.COMMENT.WEBLOGASPECT: Parámetro de respuesta: "Hola, Yanggch"
A partir de esto, podemos ver que, aunque no escribimos el código para emitir el método de inicio de sesión en el método REST de la interfaz, podemos agregar automáticamente el código para emitir los parámetros de entrada y devolver los parámetros a cada método de entrada de REST a través de AOP y ejecutarlo correctamente.
Otras instrucciones
Los tipos de consejos y el lenguaje de expresión de AOP para Pointcut se mencionan anteriormente. Para referencias específicas, consulte ellas de la siguiente manera.
Tipo de consejo
Lenguaje de expresión de AOP
1. Método de coincidencia de parámetros
@args ()
2. Método Descripción coincidente
Ejecución (modificadores-patern?
donde el patrón de tipo de retorno, el patrón de nombre y el patrón de parámetros es necesario.
. Ret-type-patern: puede ser un nombre de clase que representa cualquier valor de retorno, ruta completa, etc.
*. Nombre Patrón: especificar el nombre del método, * representa todos
.set representa todos los métodos que comienzan con SET.
. Patrón de parámetros: especificar los parámetros del método (tipo declarado), (..) representa todos los parámetros, y () representa un parámetro
. (, String) significa que el primer parámetro es cualquier valor y el segundo es de tipo cadena.
3. Actualidad de objeto AOP proxy
4. Matriota de clase de destino
@objetivo()
@dentro de()
5. Métodos de coincidencia marcados con esta anotación
@anotación()
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.