0. sobre AOP
La programación orientada al aspecto (AOP) es un tema candente en el desarrollo de software y una parte importante del marco de primavera. 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.
AOP es una continuación de OOP.
Las funciones principales son: registro, estadísticas de rendimiento, control de seguridad, procesamiento de transacciones, manejo de excepciones, etc.
La intención principal es dividir los códigos, como el registro, las estadísticas de rendimiento, el control de seguridad, el procesamiento de transacciones, el manejo de excepciones, etc. del código de lógica comercial. Al separar estos comportamientos, esperamos separarlos en métodos lógicos comerciales que no sean adquisiciones, y luego cambiar estos comportamientos sin afectar el código de lógica comercial.
Una tecnología que agrega dinámicamente funciones a los programas sin modificar el código fuente se puede lograr a través de métodos de precompilación y proxy dinámico durante el tiempo de ejecución. AOP es en realidad una continuación del modelo de diseño GOF. El modelo de diseño está buscando desacoplamiento entre la persona que llama y la Callee, mejorando la flexibilidad y la escalabilidad del código. Se puede decir que AOP es una implementación de este objetivo.
Proporciona un rico soporte para la programación orientada a los aspectos en la primavera, lo que permite el desarrollo de cohesivos separando la lógica comercial de la aplicación de los servicios a nivel de sistema, como la auditoría y la gestión de transacciones. Los objetos de aplicación solo implementan lo que deben hacer, una lógica comercial completa, eso es todo. No son responsables (o incluso conscientes de) otras preocupaciones a nivel de sistema, como el registro o el soporte de transacciones.
1. Cargue otros archivos de configuración externos o archivos de propiedad en Spring a través de PropertyPlaceHolderConfigurer:
En muchos proyectos de Javaee, el papel de la primavera es muy importante. Es un contenedor liviano que administra otros módulos y componentes. La primavera a menudo necesita administrar puntales, ibatis, hibernar, etc. Los archivos de configuración de estos marcos de código abierto se cargan en Spring a través de la propiedad de Spring en la administración de la propiedad de Spring. Además, la información de conexión de la base de datos, los archivos de propiedad de información de conexión de JNDI, etc., también se pueden cargar en Spring a través de Property PlaceHolderConfigurer para la administración. El uso es el siguiente:
(1). Cargue otros archivos en la primavera a través de PropertyPlaceHolderConfigurer:
Agregue la siguiente configuración en el archivo de configuración de Spring:
<bean class = "org.springframework.beans.factory.config.propertyplaceholderConfigurer"> <Property name = "ubicaciones"> <valor> classpath: nombre de archivo para cargar </valor> ... </property> </rena>
(2). El archivo de configuración o atributo que se cargará a través de la configuración en (1) se carga en Spring. Si también necesita usar información sobre la configuración o el archivo de datos cargado en tiempo de ejecución, como el uso de la información de conexión de la base de datos o la información de conexión JNDI, puede usar la sintaxis de las expresiones de tipo EL para hacer referencia, por ejemplo:
<bean id = "dataSource" destruye-method = "cerrador" class = "org.apache.common.dbcp.basicdataSource"> <!-Suponga que la información de conexión de la base de datos está escrita en un archivo de propiedad externo y ha sido cargado por Spring-> <Property Name = "DriverClassName" Value = "$ {Driver" "/> <nombre de propiedad =" Url "Valor" Url ". <Property Name = ”UserName” Value = ”$ {UserName}”/> <Property Name = ”Password” Value = ”$ {Password}”/> </bean>
Nota: También puede usar <context: Property-placeHolderLocation = "classpath: nombre del archivo para cargar"/>
2. Proxy dinámico para Java:
El principio de implementación subyacente de Spring es proxy dinámico, por lo que primero debe comprender el proxy dinámico antes de aprender la programación orientada a los aspectos.
El proxy dinámico se usa ampliamente en Java, y el proxy dinámico es uno de los patrones de diseño clásicos que se usan muy comúnmente en los patrones de diseño en 23. El principio de proxy dinámico es que cuando se llama a un objeto objetivo o su método a través del objeto objetivo a través de este objeto proxy.
El principio simple del proxy dinámico es el siguiente:
Llamador del cliente -> Objeto proxy -> llamado objeto de destino.
Cuando el cliente llama al objeto proxy, el objeto proxy delega el objeto objetivo para llamar a su método comercial.
El proxy dinámico se divide en dos tipos: proxy dinámico para interfaces y proxy dinámico para clases ordinarias. El proxy dinámico en Java es un proxy dinámico para interfaces reales. CGLIB es un proxy dinámico para las clases ordinarias. El paquete de dependencia de Javaee de destino y el paquete Spring JAR ya contienen paquetes JAR relacionados con CGLIB, por lo que puede proxie dinámicamente el proxy o las clases ordinarias.
(1). Java's Dynamic Proxy para interfaces:
El proxy dinámico en Java solo puede ser proxyedizado dinámicamente para interfaces. Por lo tanto, el objeto de destino debe implementar interfaces, y el objeto proxy debe implementar todas las interfaces del objeto de destino. El flujo de trabajo es el siguiente:
a. Escritura dinámica de clase proxy:
Nota: El proxy dinámico debe implementar la interfaz InvocationHandler e implementar los siguientes métodos:
La copia del código es la siguiente:
Object Invoke (instancia de proxy ObjectM, instancia de método del método de interfaz llamado en la instancia de proxy del método, objeto [] una matriz de objetos de los valores de parámetros pasados en la instancia de proxy);
Se explica la documentación para instalar JDK. Este método se utiliza para pasar la instancia de proxy, identificar el objeto java.lang.reflect.method que llama al método y una matriz de tipo de objeto que contiene parámetros. El controlador de llamadas maneja la llamada del método codificado de manera apropiada, y el resultado que devuelve se devolverá como resultado de la llamada de método en la instancia de proxy.
b. Crear un objeto proxy:
Proxy.newproxyInstance (cargador de clases, clase <?> [] Matriz de interfaz, objeto proxy de devolución de llamada (generalmente esto)))
Cuando se llama al método del objeto de destino, el objeto proxy del objeto de destino se crea a través del método. El objeto proxy llamará automáticamente su método de Invoke para llamar al objeto de destino y devolver el resultado de la llamada.
(2) .Cglib es proxy dinámico para las clases de Java ordinarias:
Cuando CGLIB crea un proxy dinámico, no requiere la clase de destino para implementar una interfaz. Su flujo de trabajo es el siguiente:
a. Escritura dinámica de clase proxy:
Potencador potencador = nuevo mejor (); // Establezca la clase principal de la clase de destino en su propio potencador.setsuperClass (clase de destino objeto.getclass ()); // Establezca el objeto de devolución de llamada al objeto proxy dinámico en sí mismo potencer.setCallback (esto);
b. Implementar la interfaz MethodInterceptor:
Implementar el siguiente método:
Object Intercept (instancia de proxy ObjectM, instancia del método del método de interfaz llamado en la instancia de proxy del método, objeto [] una matriz de objetos de los valores de parámetros pasados a la llamada del método en la instancia proxy, instancia de proxy del método del método);
Nota: CGLIB no solo puede proxy dinámicamente para las clases, sino también proxy dinámicamente para los métodos.
3. Conceptos básicos de programación orientada (AOP):
Tome un método de Java ordinario como ejemplo
Nombre del método de tipo de retorno público (Lista de parámetros) {−> Código de preprocesamiento de método de notificación envolvente-> pre-notificación Try {Method Epperry Implementation (Method Body) ... Método Código de postprocesamiento-> Postnotificación} Catch (Tipo de excepción E) {Manejo de excepciones ... "Notificación de excepción} Finalmente {Último agente de procesamiento ...-> Notificación final}}
a. Preocupación transversal: por ejemplo, en las 5 ubicaciones de notificación anteriores, en los objetos Java, estos objetos con una lógica de procesamiento común similar que se pueden agregar a la lógica de procesamiento, como la verificación de permisos, el procesamiento de cosas, el registro, etc. se denominan preocupaciones transversales. El enfoque de la programación orientada a objetos (OOP) es abstraer verticalmente las cosas en el mundo real en un modelo de objeto de programación. El enfoque de la programación orientada a los aspectos (AOP) es horizontal, que abstrae los lugares similares al procesamiento de la lógica en el modelo de objeto de programación para formar una tangente, mientras que la lógica de procesamiento en el objeto de programación es un enfoque tangente horizontal.
b. Aspecto: Abrazar las preocupaciones transversales es formar una sección, que es similar a la clase. Los dos tienen diferentes preocupaciones. Las clases son abstracciones de las características de las cosas, y las secciones son abstracciones de preocupaciones transversales.
do. Unión de unión: el punto que se intercepta se menciona en la primavera, porque Spring solo admite puntos de conexión de tipo método, es decir, el método interceptado. Método como se muestra en el ejemplo anterior.
d. Pointcut: se refiere a la definición de interceptar un punto de conexión, que es una colección de puntos de conexión, es decir, una colección de una serie de métodos interceptados.
mi. Consejo: se refiere a qué hacer después de interceptar el punto de conexión, es decir, procesamiento lógico después de interceptar. La verificación de permiso habitual, el procesamiento de cosas, el registro y otras operaciones se definen y completan en notificaciones.
F. Objetivo: el objeto objetivo del proxy, es decir, el objeto interceptado. Como en el ejemplo anterior, el objeto donde se encuentra el método.
gramo. Tejido: se refiere al proceso de aplicar una sección al objeto objetivo y causando la creación de un objeto proxy.
h. Introducción: sin modificar el código, la introducción puede agregar dinámicamente algunos métodos y campos a la clase durante el tiempo de ejecución.
4. Spring admite dependencias que admiten la programación orientada (AOP):
Se descomprimen los siguientes 3 paquetes en el directorio después de la primavera:
lib/spectj/spectjweaver.jarlib/sightj/sightjrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. Al usar la programación orientada al aspecto (AOP) en Spring, debe introducir el espacio de nombres de AOP en el archivo de configuración de Spring, es decir, agregue la siguiente configuración:
xmlns: aop = "http://www.springframework.org/schema/aop" "http://www.springframework.org/schema/aop http://www.springfframework.orgschema/ http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "
Nota: Spring 2.5 proporciona dos métodos AOP, a saber, basados en el archivo de configuración XML y el método de anotación Java.
Para usar el método de anotación AOP, debe agregar el siguiente método de anotación de objetos AOP Soporte en el archivo de configuración de Spring:
<aop: aspectoj-autoproxy/>
6. Clase de embalaje de Javabean - Beanwrapper:
Spring encapsula el comportamiento de un Javabean a través de la clase BeanWrapper, y puede establecer y obtener sus valores de atributo, como:
BeanWrapper Wrapper Class Object = BeanWrapperImpl (nueva clase envuelta ()); WRAPPER Class Object.SetPropertyValue ("Nombre de la propiedad", "Valor de propiedad");
Este método le permite establecer propiedades en la clase envuelta.
7. Desarrollo de programación orientada orientada (AOP) basado en la anotación:
(1). Agregue el soporte AOP para los métodos de anotación en el archivo de configuración de Spring.
(2). Defina la sección:
Similar a la creación de una clase normal, agregando la anotación "@Aspect" antes de que la clase indique que la clase es una sección.
(3). Agregue puntos de entrada a la superficie de corte:
Un punto de corte de puntos es una colección de métodos de objetos interceptados. Por lo general, el punto de corte de puntos se define en un método para procesar el punto de corte de puntos en la sección. Use la anotación "@Pointcut", y la sintaxis es la siguiente:
@PointCut ("Ejecution (*com.test.service ..*.*(..))") public void anymethod () {// El método se llama "procesamiento de punto" y "corte de punto"}}
Explicación detallada de los parámetros de sintaxis:
a. El primer "*": significa que el método interceptado es un tipo de retorno arbitrario.
b. com.test.service: Aquí hay un ejemplo simple, que indica el nombre del paquete que se interceptará, es decir, el paquete para ser interceptado.
do. Los dos ".." Después del nombre del paquete interceptado: significa que los subpackets debajo del paquete interceptado también se interceptan de manera recursiva, es decir, la subpacket interceptada.
d. "*" After "..": representa todas las clases debajo del paquete interceptado y su subpackaje, es decir, la clase interceptada.
mi. El último "*": representa todos los métodos en la clase interceptada, es decir, el método interceptado.
F. "(..)": significa que el método interceptado recibe cualquier parámetro, es decir, los parámetros interceptados.
Nota: La sintaxis de la definición de corte puntual puede admitir caracteres comodín, pero debe seguir estrictamente las reglas de sintaxis. como:
@PointCut ("Ejecución (*com.test.service ..*. Agregar*(..))") Significa interceptar métodos que comienzan con "Agregar" en todas las clases bajo el paquete com.test.service y su subpackage.
(4). Agregue notificaciones a la sección:
Para ubicaciones de notificación en primavera, consulte los pequeños ejemplos en 3.
Anotación "@before": declara una notificación previa.
Anotación "@AfterruRURING": Declarar post notificación.
Anotación "@After": declara el aviso final.
Anotación "@Afterthrowing": declarar notificación de excepción.
Anotación "@Around": declara notificaciones circundantes.
Un ejemplo de definición de notificaciones es el siguiente:
@Before ("Anymethod () (el nombre del punto de entrada declarado en la cara de hendidura)") public void doaccesscheck () {...}
Nota: La notificación envolvente es ligeramente diferente de los otros 4 tipos de notificaciones. La notificación envolvente se define de manera especial. La notificación envolvente funcionará antes y después de toda la llamada del método, por lo que el objeto de punto de conexión debe usarse para decirle al punto de conexión que continúe su procesamiento lógico después del procesamiento de notificación envolvente. Su definición es la siguiente:
@Around (buscar en el nombre del punto) Objeto público DobasicProfiling (procedingJoinPoint PJP) lanza Throwable {... return pjp.proceed (); // Esta oración le dice al punto de conexión que continúe realizando otras operaciones} 8. Algunos consejos para el desarrollo de la programación orientada a los aspectos (AOP) basados en la anotación:
(1). Obtener parámetros de entrada:
como:
@Bebore ("Regístrese en el nombre DOT && args (nombre del parámetro de entrada)") public void dosomething (name de parámetro de entrada de cadena) {...}
(2). Obtenga el resultado de retorno:
como:
@AfterReturning (PointCut = "Nombre de señalización de signo", return = "Return Result Name") public void dosomething (nombre de resultado de cadena) {...}
9. Desarrollo de la programación orientada a la sección (AOP) basado en XML:
(1). Defina la clase de faceta y agregue notificaciones a la clase faceta.
(2). Configure la clase Facet en el archivo de configuración de Spring como la clase Java ordinaria.
(3). Agregue la configuración de AOP en el archivo de configuración de Spring de la siguiente manera:
<aop: config> <!-Sección de configuración-> <aop: aspecto id = "sección id" ref = "id de la clase de sección en el archivo de configuración de resorte"> <!-punto de configuración-> <aop: punto id = "section id" expresión = "ejecución (*com.test.service ..*.*(..)") "/> <!-Notificación de configuración-> <aop: antes de punto- Métodos en la clase de sección "/> <aop: después .../> ... </aop: aspecto> </aop: config>
10. Procesamiento de transacciones de primavera (procesamiento de transacciones declarativas de primavera):
En pocas palabras, una transacción se refiere a una de las operaciones más básicas de la base de datos. Una explicación detallada de la transacción se explicará en detalle en el resumen relacionado con la base de datos. Una de las aplicaciones más importantes de la programación orientada orientada de Spring (AOP) es la gestión de transacciones. La gestión de transacciones de las versiones Spring 2.5 y posteriores admite dos tipos de métodos basados en anotaciones y métodos basados en archivos XML:
(1). Gestión de transacciones Basado en el método de anotación:
a. Agregue el espacio de nombres de administración de transacciones en el archivo de configuración de Spring de la siguiente manera:
xmlns: ts = http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
b. Configure el Administrador de transacciones en el archivo de configuración de Spring de la siguiente manera:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.dataSourCetransactionManager”> <Property name = ”dataSource” ref = ”id del bean de la fuente de datos configurado en Spring”/>
do. Agregar elementos de configuración de transacción que admiten los métodos de anotación en el archivo de configuración de Spring son los siguientes:
<TX: Annotation-DriventRansaction-Manager-TX: Annotation-DriventRansaction-Manager = ”TXManager (ID de Bean de administrador de transacciones configurado en primavera)”/>
d. Utilice la gestión de transacciones basada en anotaciones:
En el proyecto Javaee administrado por Spring, la lógica comercial de la transacción debe agregarse con la anotación "@Transactional".
(2). Gestión de transacciones Basado en el método de archivo XML:
a. Configure el Administrador de transacciones en el archivo de configuración de Spring de la siguiente manera:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.dataSourCetransactionManager”> <Property name = ”dataSource” ref = ”id del bean de la fuente de datos configurado en Spring”/>
b. Agregue las siguientes secciones de gestión de cosas en el archivo de configuración de Spring:
<aop: config> <!-Configurar el punto de entrada de transacciones-> <aop: pointCut id = ”transaccionPointCut” Expression = ”Execution (*com.test.service ..*.*(..))”/> <!-Configure la notificación de transacciones-> <aop: advance-rref = ”txadvice” pointcut-ref = ”transaccionPointcut”/> </aop:do. Agregue las siguientes características para las notificaciones de transacción en el archivo de configuración de Spring:
<tx: consejo id = "txadvice" transaccionManager = "txmanager"> <tx: atributes> <!-Aquí hay un ejemplo para establecer el método de consulta que comienza con Get to Reading Only, y no admite Transacciones-> <tx: Method Name = "Get*" Ready = "True" Propagation = "Not_upported"/> <!-Otros Métodos están establecidos a Spring's Watter name = ”*”/> </tx: atributos> </tx: consejo>