使用XML配置Spring AOP

本文详细介绍了如何使用XML配置Spring AOP,包括<aop:config>、<aop:pointcut>和<aop:aspect>等核心元素的用法,以及它们的属性和子元素。通过实例演示了如何配置切面、切入点和增强,帮助读者掌握Spring AOP的XML配置方法。

   使用XML配置Spring AOP可以使得传统AOP的配置工作简单,下面介绍XML中使用到的相关元素:

●<aop:config>:配置AOP功能的根元素

●<aop:pointcut>:配置AOP的切入点

●<aop:advisor>:配置AOP增强

●<aop:aspect>:配置AOP切面

●<aop:declare-parents>:配置引入增强

<aop:before>:配置前置增强

●<aop:after>:配置后置增强

●<aop:after-returning>:配置返回后增强

●<aop:after-throwing>:配置抛出异常后增强

●<aop:around>:配置环绕增强


下面对其中的<aop:config>元素、<aop:pointcut>元素与<aop:aspect>元素进行说明;

1.<aop:config>元素

   <aop:config>元素是Spring AOP配置的根元素,可以包含两个属性和三个子元素。

●属性proxy-target-class:如果是true,则使用cglib生成代理对象;如果是false,则根据目标类是否实现了接口选择使用Java SE动态代理或cglib生成代理对象,默认为false;

●属性expose-proxy:是否将代理对象置于ThreadLocal中,默认false,如果设为true,则可以通过AopContext.currentProxy()静态方法获取当前代理对象

●子元素<aop:pointcut>:用于配置切入点

●子元素<aop:advisor>:用于配置增强

●子元素<aop:aspect>:用于配制切面


2.<aop:pointcut>元素

   <aop:pointcut>元素是<sop:config>元素的子元素,用于配制可重用的切入点。<aop:pointcut>元素没有子元素,其常用的两个属性如下:

●属性id----用于为切入点指定唯一标识

●属性expression----用于配制切入点指示符


3.<aop:aspect>元素

   <aop:aspect>元素用于配置切面,可以包含3个属性和7个子元素

●属性id:唯一标识;

●属性ref:引用的增强Bean的id;

●属性order:切入点指示符

●子元素pointcut:配置切入点

●子元素declare-parents:配置引介增强;

●子元素before:配置前置增强

●子元素after;配置后置增强

●子元素after-returning:配置返回后增强

●子元素after-throwing:配置抛出异常后增强

●子元素around:配置环绕增强


下面通过一个例子演示:

(1)首先编写业务类,业务类GoodService,没有实现任何接口,代码如下:

package com.loster.li.spring_aop;

public class GoodsService {
	private static int ORDER_NO = 1000;  //用于生成订单编号
	
	public int buyGoods(String user,String productName){
		ORDER_NO++;
		System.out.println("【数据库插入订单】购买者"+user+",商品:"+productName
							+",订单编号:"+ORDER_NO);
		return ORDER_NO;
	}
	public void returnGoods(int orderNo){
		System.out.println("【数据库修改订单状态】订单编号:"+orderNo);
	}
}
(2)编写切面类,事务管理类TransactionManager用于对业务类进行增强:
package com.loster.li.spring_aop;

public class TransactionManager {
	
	public void beginTransaction(){
		System.out.println("【事务管理器】开始事务");
	}
	public void commit(){
		System.out.println("【事务管理器】提交事务");
	}
	public void rollback(){
		System.out.println("【事务管理器】回滚事务");
	}
}
(3)在Spring配置文件中配置AOP,命名为applicationContext.xml,其代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	<!-- 业务类  -->
	<bean id = "service" class = "com.loster.li.spring_aop.GoodsService"></bean>
	
	<!-- 切面类 -->
	<bean id = "transactionManager" class = "com.loster.li.spring_aop.TransactionManager"></bean>
	
	<!-- 切入点 -->
	<aop:config>
		<aop:aspect id = "transactionAspect" ref = "transactionManager">		
			<aop:before method = "beginTransaction"
			pointcut = "execution(* com.loster.li.spring_aop.*Service.*(..))"/>
			<aop:after-returning method = "commit"
			pointcut = "execution(* com.loster.li.spring_aop.*Service.*(..))"/>
			<aop:after-throwing method = "rollback"
			pointcut = "execution(* com.loster.li.spring_aop.*Service.*(..))"/>
		</aop:aspect>
	</aop:config>
</beans>
(4)编写测试类test1.java

package com.loster.li.spring_aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test1 {
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext(
						"/com/loster/li/spring_aop/applicationContext.xml");
		GoodsService service = (GoodsService)context.getBean("service");
		service.buyGoods("Tom", "Java EE");    //购买商品
		service.returnGoods(1100);             //退货
	}
}
(5)运行测试类test1.java,结果如下:




<think>嗯,用户想找关于使用XML配置Spring AOP的效果图或示例,特别是图解。首先,我需要回忆一下Spring AOPXML配置方式。记得在早期的Spring版本中,XML配置是比较常见的方式,后来逐渐被注解替代,但很多老项目可能还在用XML。 用户提到的引用里有几个关于切面、切入点、通知的内容,比如引用[3]详细解释了切入点和通知的关系,还有引用[4]展示了基于注解的切面示例。但用户需要的是XML配置的例子,所以得把注解转换成XML配置方式。 首先,需要确定XML配置AOP的基本结构。通常包括定义切面(aspect)、切入点(pointcut)、各种通知(advice)以及织入(weaving)。例如,在XML中,可以使用<aop:config>标签来配置这些元素。 然后,考虑如何将注解的例子转化为XML。比如引用[4]中的LouzaiAspect类,里面用了@Aspect、@Pointcut、@Before、@AfterReturning这些注解,对应到XML的话,需要在配置文件中声明切面类,并配置各个通知和切入点。 接下来,可能需要给出一个具体的示例代码,展示XML配置方式,包括如何定义切入点表达式,如何将通知方法与切入点关联起来。同时,用户想要效果图或图解,但可能无法直接提供图片,所以需要用文字描述或示例代码的结构图来代替。 另外,用户可能对XML配置的各个部分不太清楚,比如<aop:before>、<aop:after-returning>等标签的作用,需要解释每个标签对应的通知类型和执行时机。可以结合引用[3]中的解释,说明切入点定义的位置,通知的时机和动作,以及切面的组合。 还需要注意,XML配置需要引入AOP的命名空间,确保配置文件头部的声明正确。同时,切面类需要作为普通的Bean被Spring管理,所以要用<bean>标签定义或者在组件扫描中包含。 最后,用户可能需要了解XML配置与注解配置的对比,以及各自的优缺点。比如XML配置的集中管理优势,但注解更简洁。不过用户的问题主要是示例和图解,所以重点放在XML配置的具体写法上,可能附上代码示例和步骤说明,模拟图解的结构。 总结一下,回答应该包括XML配置的步骤、示例代码、各个部分的解释,以及可能的问题点,比如切入点表达式的正确性,通知方法的参数匹配等。同时,结合已有的引用内容,特别是引用[3]和引用[4],来辅助说明各个概念在XML中的对应实现。</think>### Spring AOP XML配置示例与图解说明 以下是使用XML配置Spring AOP的详细步骤和示例,结合代码和逻辑结构说明其效果。 --- #### **1. XML配置核心结构** 在XML中,需通过`<aop:config>`标签定义AOP规则,包含以下核心元素: - **切面(Aspect)**:通过`<aop:aspect>`标签定义,引用一个Bean作为切面类。 - **切入点(Pointcut)**:通过`<aop:pointcut>`标签定义,指定拦截目标方法的位置。 - **通知(Advice)**:通过`<aop:before>`、`<aop:after-returning>`等标签定义,关联切入点和具体增强逻辑。 ```xml <!-- 开启AOP自动代理 --> <aop:aspectj-autoproxy/> <!-- 定义目标类 --> <bean id="targetService" class="com.example.TargetService"/> <!-- 定义切面类 --> <bean id="loggingAspect" class="com.example.LoggingAspect"/> <!-- 配置AOP规则 --> <aop:config> <aop:aspect ref="loggingAspect"> <!-- 定义切入点 --> <aop:pointcut id="serviceMethods" expression="execution(* com.example.TargetService.*(..))"/> <!-- 前置通知 --> <aop:before method="beforeAdvice" pointcut-ref="serviceMethods"/> <!-- 后置通知 --> <aop:after-returning method="afterReturningAdvice" pointcut-ref="serviceMethods" returning="result"/> </aop:aspect> </aop:config> ``` --- #### **2. 代码与执行逻辑图解** 假设目标类`TargetService`包含方法`doWork()`,切面类`LoggingAspect`包含通知方法: ```java public class TargetService { public String doWork() { System.out.println("执行业务逻辑"); return "SUCCESS"; } } public class LoggingAspect { public void beforeAdvice() { System.out.println("[前置通知] 方法执行前记录日志"); } public void afterReturningAdvice(Object result) { System.out.println("[后置通知] 方法返回结果: " + result); } } ``` **执行流程示意图**: ``` 调用 TargetService.doWork() │ ▼ [前置通知] 执行 beforeAdvice() → 打印日志 │ ▼ 执行 doWork() → 输出 "执行业务逻辑" │ ▼ [后置通知] 执行 afterReturningAdvice() → 打印返回结果 ``` --- #### **3. 关键配置说明** 1. **切入点表达式**: `execution(* com.example.TargetService.*(..))` 表示拦截`TargetService`类中的所有方法[^3]。 2. **通知类型**: - `<aop:before>`:在目标方法执行前触发。 - `<aop:after-returning>`:在目标方法正常返回后触发,可通过`returning`属性获取返回值[^5]。 3. **织入(Weaving)**: Spring通过动态代理将切面逻辑织入目标类,生成代理对象。调用`TargetService`时实际调用的是代理对象[^2]。 --- #### **4. XML vs 注解配置对比** | **特性** | **XML配置** | **注解配置** | |----------------|------------------------------------------|---------------------------------| | 集中管理 | 配置集中,便于全局修改 | 分散在代码中,需结合组件扫描 | | 可读性 | 结构清晰,但表达式较长 | 代码简洁,但需熟悉注解语义 | | 适用场景 | 旧项目维护、无代码修改权限的情况 | 新项目开发、追求开发效率的场景 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值