Este artículo demuestra la implementación de AOP utilizando la anotación de SuppectJ y la configuración XML en primavera
El siguiente es el proyecto Java que implementa AOP utilizando anotaciones de SuppeJ
Primero está el archivo ApplicationContext.xml ubicado en ClassPath
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation http://www.springframework.org/schema/Beans/spring-Beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframwork.org/schema/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <!-Enable AtletS Soporte de OppectJ para Annotation-> <aop: OpectJ-autoproxy/> <Bean Id =" Usermanager " id = "SecurityHandler"/> </beans>
Luego está la interfaz de la capa de servicio y la clase de implementación
paquete com.jadyer.annotation; interfaz pública usermanager {public void adduser (String UserName, String Password); public void deluser (int userId); Public String FindUserById (int userId); public void ModifyUser (int userId, String UserName, String Password); } / *** El USERMANAGER anterior es la interfaz de la capa de servicio* La siguiente usermanagerIMPL es la clase de implementación de la interfaz de la capa de servicio* / paquete com.jadyer.annotation; La clase pública usermanagerImpl implementa usermanager {public void addUser (String UserName, String Password) {System.out.println ("------- UsermanagerImpl.adduser () está invocado -----"); } public void deluser (int userId) {System.out.println ("-------- usermanagerImpl.deluser () se invoca ------"); } public String FindUserById (int userId) {System.out.println ("------ UsermanagerImpl.FinduserById () está invocado ------"); regresar "vida con cara de hierro"; } public void ModifyUser (int userId, String UserName, String Password) {System.out.println ("------- UsermanagerImpl.ModifyUser () está invocado ------"); }} La siguiente es la clase de entrada marcada con SuppeJ
paquete com.jadyer.annotation; importar org.spectj.lang.annotation.After; importar org.spectj.lang.annotation.spect; importar org.spectj.lang.annotation.pointcut; @Aspect Public Class SecurityHandler { /** * Define PointCut * @see PointCut El nombre de PointCut es addDMethod (). Este método no tiene valor de retorno y parámetros* @See Este método es un identificador y no lo llama*/@PointCut ("Ejecution (* add* (..))") // Haga coincidir todos los métodos que comienzan con agregar private void addadDmethod () {}; /*** Definir consejos* @see indica a qué suscripciones de puntos se aplica nuestro consejo en los puntos de unión*/// @antes ("addadDmethod ()") @After ("addDDMethod ()") private void checkSecurity () {System.out.println ("------- 【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【uct. }} Finalmente, la clase de prueba del cliente
paquete com.jadyer.annotation; importar org.springframework.context.applicationContext; importar org.springframework.context.support.classpathxmlaPplicationContext; /*** Soporte de primavera para AOP: adopta el método de anotación* @see ----------------------------------------------------------------------------------------------------------------------------------------------------------- Prerrequisito: dado que es un proxy dinámico JDK, si desea generar un proxy, la clase debe implementar una interfaz* @See si la clase no tiene una interfaz de implementos y todavía usa la implementación predeterminada de AOP de Spring, un error ocurre* @See las clases que generalmente necesitan generar un proxy son todas las clases de nivel de servicio, por lo que una interfaz de la interfaz generalmente será dibujar. Es decir, desarrolle el hábito de la programación orientada a la interfaz* @see --------------------------------------------------------------------------- --------------------------------------------------------------------------- Soporte de anotación agregada * @see * spring_home // dist // spring.jar * @see * spring_home // lib // log4j // log4j-1.2.14.jar * @see * spring_home // lib // jakarta-commons // commons-logging.jar * @see * treing_home // lib // aspectJ // *. Incursos de shicing cruzado y establecer SecurityHandler.java * @see 3. Use anotaciones para especificar SecurityHandler como aspecto * @See 4. Use anotaciones para definir asesoramiento y punto * @See 5. Habilite el soporte de SuppectJ para la anotación y configure la clase de clase de destino en el contenedor IOC * @see 6. Desarrollo Cliente * @seeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee --------------------------------------------------------------------------------------------------------------------------------------------------- (Usermanager) factory.getBean ("usermanager"); usermanager.adduser ("Zhang Qiling", "02200059"); }} El siguiente es el proyecto Java que implementa AOP usando archivos de configuración XML
Primero es el archivo ApplicationContext-CGlib.xml ubicado en el directorio raíz de SRC
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation http://www.springframework.org/schema/Beans/spring-Beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframwork.org/schema/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <!-Uso de fuerza de cglib proxy-> <!-<aop: aspectoj-autoproxy proxy-target-class-closhs id = "usermanager"/> <bean id = "seguridadhandler"/> <aop: config> <aop: aspecto id = "SecurityAspect" ref = "SecurityHandler"> <aop: PointCut id = "addDMethod" expresion = "ejecution (* add* (..))"/> <aop: antes del método = "comprobar" puntos "puntos" punto-fut-fut-ref = "addaddmethod"/> </> </aop: </aOP: <///////> <///////////////////////////////////AOP </aop: config> </le beans> <!- coincida con todos los métodos que comienzan con add (*add*(..)) Haga coincidir todos los métodos de todas las clases en com.jadyer.servcices.Impl Execution (*com.jadyer.servcices.Impl.*.*(..)) coinciden con todos los métodos de add en com.jadyer.servcices.Impl o deleced com.jadyer.services.impl.*. Agregar*(..)) || ejecución (*com.jadyer.services.impl.*. del*(..)) ->
Luego está la interfaz de la capa de servicio y la clase de implementación
paquete com.jadyer.cglib; interfaz pública usermanager {public void adduser (String UserName, String Password); public void deluser (int userId); Public String FindUserById (int userId); public void ModifyUser (int userId, String UserName, String Password); } / *** El USERMANAGER anterior es la interfaz de la capa de servicio* La siguiente usermanagerIMPL es la clase de implementación de la interfaz de la capa de servicio* / paquete com.jadyer.cglib; clase pública usermanagerImpl {// implementa usermanager {public void addUser (String UserName, String Password) {System.out.println ("------- UsermanagerImpl.adduser () está invocado -----"); } public void deluser (int userId) {System.out.println ("-------- usermanagerImpl.deluser () se invoca -----"); } public String FindUserById (int userId) {System.out.println ("------ UsermanagerImpl.FinduserById () está invocado -----"); regresar "Zhang San"; } public void Modifyuser (int userId, String UserName, String Password) {System.out.println ("------- UsermanagerImpl.ModifyUser () está invocado -----"); }} La siguiente es la clase de entrada especificada en ApplicationContext-Cglib.xml
paquete com.jadyer.cglib; importar org.spectj.lang.joinpoint; /*** Pase la información de llamadas del cliente al consejo* @see Puede agregar un parámetro de punto de unión al consejo para obtener el nombre del método y el valor de parámetro de la llamada del cliente* @see en el futuro, hay menos casos de uso puramente de AOP para escribir cosas como esta. Usamos principalmente las transacciones proporcionadas por Spring* @see que puede saber sobre esto. El siguiente es el código de muestra */ Public Class SecurityHandler {private void checkSecurity (unkepoint unePoint) {for (int i = 0; i <unkePoint.getArgs (). Longitud; i ++) {System.out.Println (unkenPoint.getArgs () [i]); // Obtenga el valor de parámetro del método llamado por el cliente} system.out.println (unkepoint.getSignature (). GetName ()); // Obtenga el nombre del método llamado por el cliente System.out.println ("------ [CheckSecurity se invoca] ------"); }} Finalmente, la clase de prueba del cliente
paquete com.jadyer.cglib; importar org.springframework.context.applicationContext; importar org.springframework.context.support.classpathxmlaPplicationContext; /** * @ver ----------------------------------------------------------------------------------------------------------------------------------------------------------- herencia, es mejor no usar la declaración final para la clase de destino* @see ----------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- Porque los objetivos que proxy son generalmente objetos comerciales* @see --------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- Cliente de clase pública {public static void main (String [] args) {ApplicationContext Factory = new ClassPathXMLApPlicationContext ("ApplicationContext-Cglib.xml"); // Cuando USERMANAGERIMPL implementa la interfaz USERMANAGER, Spring usará automáticamente el proxy dinámico JDK // Si el proyecto ha introducido la biblioteca CGLIB y forzó el uso de cglib proxy en el archivo de configuración, Spring solo usará el proxy // usermanager usermanager = (usermanager) factory.getBean ("usermanager"); // Debido a que el USERMANAGERIMPL no implementa la interfaz USERMANAGER en este momento, la interfaz USERMANAGER no se puede utilizar en el tipo de recepción .// La biblioteca CGLIB se ha introducido en el proyecto. Aunque el proxy CGLIB no se ve obligado a usarse en el archivo de configuración, Spring usará automáticamente el proxy CGLIB usermanagerImpl usermanager = (usermanagerImpl) factory.getBean ("usermanager"); usermanager.adduser ("Wu Sansheng", "02200059"); }}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.