Spring学习----------Spring实现AOP

本文详细介绍Spring框架下两种AOP实现方式:基于AspectJ注解及XML配置。通过具体实例展示了如何为不同方法添加前置、后置及环绕通知,实现日志记录等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring实现AOP主要有两种方式:
1.基于AspectJ注解
2.基于XML配置
接下来我们分别介绍如何使用这两种方式来实现AOP

一.使用注解方式实现AOP功能
利用Spring注解方式可以实现前置通知,后置通知,例外通知以及环绕通知等。
实现AOP功能步骤如下:
  1. 引入Jar文件
  2. 配置AOP命名空间
  3. 创建目标对象类
  4. 创建切面
  5. 在配置文件中配置切面
  6. 创建入口类进行测试
接下来我们在示例中演示一下
具体要求如下:
  • 创建一个Java Bean,例如PersonBean
  • PersonBean包含一些简单的业务逻辑,例如运动相关,包括走路,跑步,爬山,打球等。
  • 在每个运动的方法前,方法中,以及方法后输出相关的日志信息。

Step1:在classpath下的AspectJ类库:
[plain] view plain copy
  1. spring-aspects.jar  
  2. aspectj.weaver.jar  
  3. aopalliance.jar  

Step2:创建一个接口Person
[java] view plain copy
  1. public interface Person {  
  2.     public void work();  
  3.     public void run();  
  4.     public void playBasketball();  
  5.     public void swim();  
  6. }  

Step3:定义Tager Object
[java] view plain copy
  1. import org.springframework.stereotype.Component;  
  2.   
  3. /** 
  4. * Created by icarus on 2016/6/13. 
  5. * Person接口实现类 
  6. */  
  7. @Component("personimpl1")  
  8. public class PersonImpl1 implements Person{  
  9.     public void work() {  
  10.         System.out.println("散步!");  
  11.     }  
  12.     public void run() {  
  13.         System.out.println("跑步!");  
  14.     }  
  15.     public void playBasketball() {  
  16.         System.out.println("打篮球!");  
  17.     }  
  18.     public void swim() {  
  19.         System.out.println("游泳!");  
  20.     }  
  21. }  

Step4:定义Aspect和Advice
[java] view plain copy
  1. import org.aspectj.lang.JoinPoint;  
  2. import org.aspectj.lang.ProceedingJoinPoint;  
  3. import org.aspectj.lang.annotation.*;  
  4. import org.springframework.stereotype.Component;  
  5.   
  6. @Aspect  
  7. @Component("loggingaspect")  
  8. public class  LoggingAspect {  
  9.     @Pointcut("execution(* cn.lovepi.chapter06.aop.test.PersonImpl1.*(..))")  
  10.     public void sport(){  
  11.   
  12.     }  
  13.   
  14.     /** 
  15.     * 方法执行前记录日志 
  16.     * @param jp 连接点 
  17.     */  
  18.     @Before("sport()")  
  19.     public void loggerBeforeAction(JoinPoint jp) {  
  20.         System.out.println(jp.getSignature().getName()+"执行开始");  
  21.   
  22.     }  
  23.   
  24.     /** 
  25.     * 方法执行过程中记录日志 
  26.     * @param pjp 只能在Around 的advice中使用 
  27.     * @throws Throwable 
  28.     */  
  29.     @Around("sport()")  
  30.     public void loggerAroundAction(ProceedingJoinPoint pjp) throws Throwable {  
  31.         pjp.proceed();//执行原方法  
  32.         System.out.println(pjp.getSignature().getName()+"执行过程中... ...");  
  33.     }  
  34.   
  35.     /** 
  36.     * 方法执行完记录日志 
  37.     * @param jp 连接点 
  38.     * @throws Throwable 
  39.     */  
  40.     @After("sport()")  
  41.     public void loggerAfterAction(JoinPoint jp){  
  42.         System.out.println(jp.getSignature().getName()+"执行结束");  
  43.   
  44.     }  
  45. }  

Step5:进行Aop设置
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.       xmlns:aop="http://www.springframework.org/schema/aop"  
  5.       xmlns:context="http://www.springframework.org/schema/context"  
  6.       xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.       http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.       http://www.springframework.org/schema/aop  
  9.       http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
  10.     <!--开启注解扫描-->  
  11.     <context:component-scan base-package="cn.lovepi.chapter06.aop.test"/>  
  12.     <!--开启Spring动态代理-->  
  13.     <aop:aspectj-autoproxy proxy-target-class="true"/>  
  14. </beans>  

说明:必须在Spring IoC容器中启用AspectJ动态代理支持

Step6:测试
[java] view plain copy
  1. public class Main {  
  2.     public static void main(String[] args){  
  3.         ApplicationContext context=  
  4.                 new FileSystemXmlApplicationContext("src/conf/conf-test.xml");  
  5.         cn.lovepi.chapter06.aop.test.PersonImpl1 person=context.getBean("personimpl1",cn.lovepi.chapter06.aop.test.PersonImpl1.class);  
  6.         person.run();  
  7.         person.work();  
  8.         person.playBasketball();  
  9.         person.swim();  
  10.     }  
  11. }  

程序执行结果:
run执行开始
跑步!
run执行过程中... ...
run执行结束
work执行开始
散步!
work执行过程中... ...
work执行结束
playBasketball执行开始
打篮球!
playBasketball执行过程中... ...
playBasketball执行结束
swim执行开始
游泳!
swim执行过程中... ...
swim执行结束


二.使用Spring XML配置方式实现AOP功能
实现AOP的主要步骤如下:
  1. 引入Jar文件
  2. 配置AOP命名空间
  3. 创建目标对象类
  4. 创建切面
  5. 在配置文件中配置
  6. 创建入口类进行测试
接下来我们在示例中演示一下
具体要求如下:
  • 创建一个Java Bean,例如PersonBean
  • PersonBean包含一些简单的业务逻辑,例如运动相关,包括走路,跑步,爬山,打球等。
  • 在每个运动的方法前,方法中,以及方法后输出相关的日志信息。

Step1:在classpath下的AspectJ类库:
[plain] view plain copy
  1. spring-aspects.jar  
  2. aspectj.weaver.jar  
  3. aopalliance.jar  

Step2:创建一个接口Person
[java] view plain copy
  1. public interface Person {  
  2.     public void work();  
  3.     public void run();  
  4.     public void playBasketball();  
  5.     public void swim();  
  6. }  

Step3:定义Tager Object
[java] view plain copy
  1. public class PersonImplXml implements Person{  
  2.     public void work() {  
  3.         System.out.println("散步!");  
  4.     }  
  5.   
  6.     public void run() {  
  7.         System.out.println("跑步!");  
  8.     }  
  9.   
  10.     public void playBasketball() {  
  11.         System.out.println("打篮球!");  
  12.     }  
  13.   
  14.     public void swim() {  
  15.         System.out.println("游泳!");  
  16.     }  
  17. }  

Step4定义Aspect和Advice
[java] view plain copy
  1. import org.aspectj.lang.JoinPoint;  
  2. import org.aspectj.lang.ProceedingJoinPoint;  
  3.   
  4. /** 
  5. * Created by icarus on 2016/6/13. 
  6. */  
  7. public class LoggingAspectXml {  
  8.     /** 
  9.     * 开始执行方法 
  10.     * @param jp 
  11.     */  
  12.     public void loggerBeforeAction(JoinPoint jp) {  
  13.         System.out.println(jp.getSignature().getName()+"执行开始");  
  14.   
  15.     }  
  16.   
  17.     /** 
  18.     * 方法执行中 
  19.     * @param pjp 
  20.     * @throws Throwable 
  21.     */  
  22.     public void loggerAroundAction(ProceedingJoinPoint pjp) throws Throwable {  
  23.         pjp.proceed();//执行原方法  
  24.         System.out.println(pjp.getSignature().getName()+"执行过程中... ...");  
  25.     }  
  26.   
  27.     /** 
  28.     * 方法执行结束 
  29.     * @param jp 
  30.     */  
  31.     public void loggerAfterAction(JoinPoint jp){  
  32.         System.out.println(jp.getSignature().getName()+"执行结束");  
  33.   
  34.     }  
  35. }  

Step5:进行Aop设置
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">  
  5.     <!--开启Spring动态代理-->  
  6.     <aop:aspectj-autoproxy proxy-target-class="true"/>  
  7.     <!--bean 配置-->  
  8.     <bean id="personImplXml" class="cn.lovepi.chapter06.aop.test.PersonImplXml"/>  
  9.     <bean id="loggingAspectXml" class="cn.lovepi.chapter06.aop.test.LoggingAspectXml"/>  
  10.     <!--aop 配置-->  
  11.     <aop:config>  
  12.         <!--设置切点-->  
  13.         <aop:pointcut id="loggingAspect" expression="execution(* cn.lovepi.chapter06.aop.test.PersonImplXml.*(..))"/>  
  14.         <!--切面设置-->  
  15.         <aop:aspect id="loggingaspect" ref="loggingAspectXml">  
  16.             <aop:before method="loggerBeforeAction" pointcut-ref="loggingAspect"/>  
  17.             <aop:around method="loggerAroundAction" pointcut-ref="loggingAspect"/>  
  18.             <aop:after method="loggerAfterAction" pointcut-ref="loggingAspect"/>  
  19.         </aop:aspect>  
  20.     </aop:config>  
  21. </beans>  

说明:必须在Spring IoC容器中启用AspectJ动态代理支持

Step6:测试
[java] view plain copy
  1. public class MainXml {  
  2.     public static void main(String[] args){  
  3.         ApplicationContext context=new FileSystemXmlApplicationContext("src/conf/conf-test-xml.xml");  
  4.         PersonImplXml person=context.getBean("personImplXml",PersonImplXml.class);  
  5.         person.work();  
  6.         person.run();  
  7.         person.playBasketball();  
  8.         person.swim();  
  9.     }  
  10. }  

程序执行结果:
run执行开始
跑步!
run执行过程中... ...
run执行结束
work执行开始
散步!
work执行过程中... ...
work执行结束
playBasketball执行开始
打篮球!
playBasketball执行过程中... ...
playBasketball执行结束
swim执行开始
游泳!
swim执行过程中... ...
swim执行结束

总结
通过最后结果相比较而言,AspectJ更值得推荐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值