用spring实现AOP有两种方式:基于xml配置方式和基于注解方式,
基于注解方式
一、架包:cglib-nodep-2.1_3.jar aspectjweaver.jar aspectjrt.jar(AOP)
其它架包:common-annotations.jar spring.jar commons-logging.jar
二、先在配置文件中加入如下内容
<?xml version="1.0" encoding="UTF-8"?> xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> </beans>
三、启动对 aspectj 的支持,在xml文件中加入如下内容
<aop:aspectj-autoproxy />
四、编写核心代码
PersonService.java
package com.qh.service; public interface PersonService { public void save(String name); public void update(String name); }
PersonServiceImp.java
package com.qh.serviceImp; import com.qh.service.PersonService; public class PersonServiceImp implements PersonService { public void save(String name) { System.out.println("我是save()方法!"+name); } public void update(String name) { System.out.println("我是update()方法!"); } }
MyInterceptor.java
package com.qh.service; /* * 切面的实现 */ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; //指明该类为一个切面 @Aspect public class MyInterceptor { /*定义切入点,拦截方法 *使用AOP表述是语言:执行(返回值类型 要拦截的包 子包 类.方法(任意参数)) *该句解释:执行 com.qh.service及其子包中的所有类的所有带任意参数的方法,并返回任意类型值 */ @Pointcut("execution(* com.qh.service..*.*(..))") private void anyMethod(){}//声明一个切入点名称anyMethod() @Before("anyMethod()")//定义前置通知,当然还有其它通知 public void doprint(){ System.out.println("执行!"); } }
//其它通知 //只拦截包含一个参数的方法,并将该参数传给doBefore()方法 @Before("anyMethod()&&args(str)") public void doBefore(String str){ System.out.println("我是前置通知!"+str); } //定义后置通知,将拦截的方法的返回结果作为doAfterReturning()方法的参数 @AfterReturning(pointcut="anyMethod()",returning="str") public void doAfterReturning(String str){ System.out.println("我是后置通知!"+str); } //定义例外通知,将异常信息作为doAfterThrowing()方法的参数 @AfterThrowing(pointcut="anyMethod()",throwing="e") public void doAfterThrowing(Exception e){ System.out.println("我是例外通知!"+e); } @After("anyMethod()")//定义最终通知 public void doAfter(){ System.out.println("我是最终通知!"); } @Around("anyMethod()")//定义环绕通知,此方法适合做权限控制 //此方法格式固定 public Object doAround(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("我是环绕通知!进入方法"); //if(){ Object object=pjp.proceed();//一定要执行的方法,假如不执行该方法,被拦截的方法是不会执行的 //} System.out.println("我是环绕通知!退出方法"); return object; }
五、将PersonServiceImp和MyInterceptor类交给spring容器
<bean id="personServiceImp" class="com.qh.serviceImp.PersonServiceImp"></bean> <bean id="myInterceptor" class="com.qh.service.MyInterceptor"></bean>
六、编写测试代码:InterceptorTest.java
package com.qh.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.qh.service.PersonService; public class InterceptorTest { @Test public void test() { ApplicationContext apx=new ClassPathXmlApplicationContext("beans.xml"); PersonService personService=(PersonService) apx.getBean("personServiceImp"); personService.save("xionggui"); } }
七、结果
执行!
我是save()方法!xionggui
八、小结(针对本例)
例外通知出现在Junit的控制台中、环绕通知多用于权限控制
基于xml配置方式
一、架包和第一种方式一样
二、xml文件
<aop:config><!-- aop配置 --> <aop:aspect id="aopCut" ref="myInterceptor"><!-- 引用切面 --> <!-- 可以定义多个切入点 --> <aop:pointcut expression="execution(* com.qh.service..*.*(..)) and args(str)" id="myPointcut"/> <aop:pointcut expression="execution(* com.qh.service..*.*(..))" id="myPointcut2"/> <aop:before method="doBeforeOne" pointcut-ref="myPointcut2" /> <aop:before method="doBefore" pointcut-ref="myPointcut" arg-names="str"/> <aop:after-returning method="doAfterReturning" pointcut-ref="myPointcut" arg-names="str"/> <!-- aop:after-throwing method="doAfterThrowing" pointcut-ref="myPointcut"/--> <aop:after method="doAfter" pointcut-ref="myPointcut2"/> <aop:around method="doAround" pointcut-ref="myPointcut2"/> </aop:aspect> </aop:config>
三、PersonServiceImp.java
package com.qh.service; /* * 切面的实现 */ import org.aspectj.lang.ProceedingJoinPoint; public class MyInterceptor { public void doBeforeOne(){ System.out.println("我是第一个前置通知!"); } public void doBefore(String str){ System.out.println("我是前置通知!"+str); } public void doAfterReturning(String str){ System.out.println("我是后置通知!"+str); } public void doAfterThrowing(Exception e){ System.out.println("我是例外通知!"+e); } public void doAfter(){ System.out.println("我是最终通知!"); } public Object doAround(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("我是环绕通知!进入方法"); //if(){ Object object=pjp.proceed();//一定要执行的方法,假如不执行该方法,被拦截的方法是不会执行的 //} System.out.println("我是环绕通知!退出方法"); return object; } }
其它代码和第一种方法一样。
四、注意
要将上面2个类交给spring容器管理
需要注意切入点执行的方法的参数
- springAOP.rar (4.2 MB)
- 下载次数: 16
- 修改后的springAOP.rar (4.2 MB)
- 下载次数: 14
发表评论
-
@transitional事务传播行为和数据库隔离级别
2011-07-31 13:04 1223@transitional事务传播行为 ... -
spring+jdbc组合开发
2011-07-31 10:04 8071、架包:commons-dbcp.jar commons- ... -
spring+jdbc组合开发
2011-07-28 23:13 7spring+jdbc组合开发 1、架包:commons-d ... -
AOP_基本概念
2011-07-23 00:00 708分散关注 将通用需求功能从不相关类之中分离出来;同时,能 ... -
AOP_使用CGLIB实现AOP功能
2011-07-22 00:02 784好处:不需要目标对象实现接口 使用的架包:cglib-nod ... -
AOP__使用JDK中的Proxy技术实现AOP功能
2011-07-21 22:28 540AOP主要用于权限的验证 细粒度的权限控制:对方法进行拦截, ... -
DI依赖注入_自动装配_autowire
2011-07-20 21:27 695自动装入:容器自动装 ... -
DI依赖注入_手动装配_注解基础
2011-07-20 22:50 1307以下的注释不管在那种配置组件的方法中都能用,这里只是实际需要才 ... -
DI依赖注入_手动装配_非注解
2011-07-18 23:15 916基本数据类型的注入(将以下代码放到对象的bean中即可) 可 ... -
spring中的方法
2011-07-18 08:03 01、实例化spring容器 ApplicationConte ... -
spring基本概念
2011-07-17 21:38 575Ioc(控制反转):应用本 ...
相关推荐
面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...
Spring AOP(面向切面编程)是Java开发中Spring框架的核心特性之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。在SSH(Struts、Spring、Hibernate)经典企业级开发框架中,Spring AOP扮演着至...
在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP...
在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...
面向切面编程(AOP)是Spring框架的另一大特色,它允许程序员将关注点分离,比如日志记录、事务管理、安全检查等,可以编写一次,然后在整个应用中到处使用。AOP通过切面(Aspect)和通知(Advice)来实现。 1. **...
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架的重要组成部分,它提供了一种在不修改原有业务代码的基础上,插入额外功能的编程模型。Spring AOP使得开发者能够更方便地实现如日志记录、事务管理、...
在Java企业级开发中,Spring框架是一个不可或缺的重要组件,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程(AOP)、数据访问/集成、Web应用、事务管理等。本示例主要聚焦于Spring框架的面向切面编程(AOP...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要组成部分,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、性能监控等。在传统的OOP(面向对象编程)中...
### AOP面向切面编程详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,它作为OOP(面向对象编程)的一种补充,主要解决了OOP在处理横切关注点方面的不足。在传统的...
面向切面编程(AOP),全称为 Aspect Oriented Programming,是Spring框架的重要特性之一,用于实现代码的解耦,提高可维护性和可复用性。AOP的核心思想是将关注点分离,将横切关注点(如日志、事务管理、性能监控)与...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本教程中,我们将深入探讨Spring AOP的基本概念、配置...
【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下对应用程序的行为进行统一管理和控制。在本实例中,我们将深入探讨如何使用AspectJ技术和XML配置来实现AOP。 首先,了解...