`

应用Spring AOP(五)-------XML配置方式

阅读更多

Spring AOP提供了xml配置文件以及Annotation注解的方式更方便的进行AOP的配置。当然这两种方式的最大的好处是更好的降低了代码耦合性。

XML配置的示例工程代码:

 和前面的工程相比,前置通知,后置通知那几个通知类没有了,所有的通知逻辑直接放到了AllLogAdvice类的方法里:

package com.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class AllLogAdvice {
	private Logger logger = Logger.getLogger(AllLogAdvice.class);

	// 此方法将作为前置通知
	public void myBeforeAdvice(JoinPoint jionpoint) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取被调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式字符串
		String logInfoText = "前置通知:" + targetClassName + "类的"
				+ targetMethodName + "方法开始执行";
		// 将日志信息写入配置的文件中
		logger.info(logInfoText);
	}

	// 此方法将作为后置通知
	public void myAfterReturnAdvice(JoinPoint jionpoint) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取被调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式字符串
		String logInfoText = "后置通知:" + targetClassName + "类的"
				+ targetMethodName + "方法开始执行";
		// 将日志信息写入配置的文件中
		logger.info(logInfoText);
	}

	// 此方法将作为异常通知
	public void myThrowingAdvice(JoinPoint jionpoint, Exception e) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取被调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式字符串
		String logInfoText = "异常通知:执行" + targetClassName + "类的"
				+ targetMethodName + "方法时发生异常";
		// 将日志信息写入配置的文件中
		logger.info(logInfoText);
	}

	// 此方法将作为环绕通知
	public void myAroundAdvice(ProceedingJoinPoint jionpoint) throws Throwable {
		long beginTime = System.currentTimeMillis();
		jionpoint.proceed();
		long endTime = System.currentTimeMillis();
		// 获取被调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式字符串
		String logInfoText = "环绕通知:" + targetMethodName + "方法调用前时间" + beginTime
				+ "毫秒," + "调用后时间" + endTime + "毫秒";
		// 将日志信息写入配置的文件中
		logger.info(logInfoText);
	}
}

 

 4种通知功能用4个方法来完成了。aop.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"
	xmlns:p="http://www.springframework.org/schema/p"
	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="myUserService" class="com.service.UserService"></bean>
		
	<!-- 定义日志通知,将日志切面交给Spring容器管理 -->
	<bean id="allLogAdvice" class="com.aop.AllLogAdvice"></bean>	
	
	<!-- 进行aop配置 -->
	<aop:config>	
	  <!-- 配置日志切面 -->
	  <aop:aspect id="logaop" ref="allLogAdvice">	 	  
	       
	    <aop:pointcut id="logpointcut" expression="execution(* com.service.UserService.*(..))" />
	    
	    <!-- 将LogAdvice日志通知中的myBeforeAdvice方法指定为前置通知 -->
	    <aop:before method="myBeforeAdvice" pointcut-ref="logpointcut"/>
	    
	    <!-- 将LogAdvice日志通知中的myAfterReturnAdvice方法指定为后置通知 -->
	    <aop:after-returning method="myAfterReturnAdvice" pointcut-ref="logpointcut"/>
	    
	    <!-- 将LogAdvice日志通知中的方法指定为异常通知 -->
	    <aop:after-throwing method="myThrowingAdvice" pointcut-ref="logpointcut" throwing="e" />
	    
	    <!-- 将LogAdvice日志通知中的方法指定为环绕通知 -->
	    <aop:around method="myAroundAdvice" pointcut-ref="logpointcut"/>
	  </aop:aspect>
	</aop:config>
	
</beans>

 定义pointcut的这句:

<aop:pointcut id="logpointcut" expression="execution(* com.service.UserService.*(..))" />

 expression里的写法参考官网解释的

6.2.3.4节:http://docs.spring.io/spring/docs/2.0.8/reference/aop.html

除了用execution外,还可以用within,this等。

这篇文章解释也不错:http://blog.csdn.net/kkdelta/article/details/7441829

这儿第一个*通配符代表所有的返回值,第二个*代表所有方法,(..)表示任意的参数类型。也就是说com.service.UserService类下面的所有任意返回值,任意参数类型的方法都会被拦截。

 

再看看主测试类MainTest:

package com.test;

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

import com.service.IUserService;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"aop.xml");
		IUserService userService = (IUserService) context
				.getBean("myUserService");

		userService.addUser("ton", 56);
		userService.deleteUser("ton");
	}
}

 这儿得到UserService的bean不再需要一个代理,而是直接用UserService定义的bean。这样的好处就是如果下次要删除通知里的逻辑,不再需要日志的功能了,我不再需要改java文件,直接在配置文件里的有关切面的配置段去掉就可以了,很好的做到了为代码解耦。

 

工程代码文件在附件中。。。。

  • 大小: 13 KB
分享到:
评论
1 楼 Coraction 2014-03-29  

相关推荐

    spring-aop-jar

    在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...

    spring aop注解方式、xml方式示例

    下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...

    spring-aop-3.0.xsd spring-beans-3.0 spring-context-3.0.xsd spring-mvc-3.1.xsd

    总的来说,Spring 框架的这些核心组件——AOP、Beans、Context 和 MVC,通过 XML 配置文件实现了高度的灵活性和可扩展性,是现代企业级 Java 应用程序开发的基石。理解并熟练使用这些配置文件,是成为 Spring 开发者...

    spring源码--AOP流程--笔记.docx

    Spring AOP 是 Spring 框架中的一部分,它提供了一种实现 AOP 的方式。 在 Spring AOP 中,主要有两个概念:Aspect 和 Advice。Aspect 是一个模块,它封装了一个或者多个 Advice。Advice 是一个函数,它提供了某种...

    spring-aop-4.2.xsd.zip

    XSD文件在Spring框架中主要用来验证和解析基于XML的配置文件,例如`beans.xml`,这些文件定义了bean的实例化、依赖注入、AOP切面等配置。 压缩包内的子文件"spring-aop-4.2.xsd.txt"可能是XSD文件的文本版本,方便...

    spring-aop-4.0.0.RELEASE

    - **注解驱动**:从4.0.0.RELEASE开始,Spring AOP支持完全基于注解的配置,大大减少了XML配置的复杂性。 3. **@Aspect注解与通知** - **@Aspect**:标记一个类为切面,包含通知和切入点定义。 - **@Before、...

    SpringAop xml方式配置通知

    **Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...

    关于Spring的spring-beans-xsd和tx-xsd aop-xsd等

    在Spring框架中,XML配置文件是早期版本中定义和管理bean的主要方式。这些XML配置文件依赖于特定的XSD(XML Schema Definition)文件来提供语法验证和代码编辑器的自动提示功能。在给定的压缩包中,包含了`spring-...

    spring-aop-3.0.xsd

    集成spring aop xml配置的必备文件,若想要application.xml中有aop节点提示,则必须添加spring-aop-3.0.xsd文件

    spring-aop-xml.rar(资源免积分/C币)

    本资源“spring-aop-xml.rar”提供了一个使用XML配置实现Spring AOP的小实验,下面将详细介绍相关知识点。 首先,我们需要理解AOP的核心概念: 1. **切面(Aspect)**:一个关注点的模块化,如事务管理或日志记录。...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    Core模块提供了ApplicationContext接口,它是Spring应用程序的核心,负责管理bean的生命周期和配置。Beans模块则实现了bean的定义、实例化、装配和管理。 2. **Data Access/Integration**:这个模块支持数据访问,...

    spring-security-web源码所需jar包

    10. **spring-security-config-3.1.2.RELEASE.jar**:提供了基于XML或Java的配置方式,用于定义安全规则和策略,如定义访问控制列表,自定义过滤器链等。 通过以上这些jar包,我们可以深入研究Spring Security Web...

    spring AOP 引入jar包,spring IOC 引入Jar包

    Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...

    Spring开发包含的各种包com.springsource.org.aopalliance-1.0.0.jar

    6. **配置与实践**:在Spring应用中,可以使用XML配置或者基于注解的方式来定义切面,编写自定义的拦截器,并指定切入点表达式来确定何时应用这些拦截器。 7. **最佳实践**:使用AOP时,应遵循模块化原则,将横切...

    spring aop用到jar包.rar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在使用Spring AOP时,通常需要引入特定的jar包来支持其功能。...

    spring aop xml 实例

    Spring AOP主要通过两种方式实现:XML配置和注解。本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时...

    用xml配置的方式进行SpringAOP开发

    总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们可以将如日志记录、事务处理等通用功能轻松地插入到业务逻辑中,...

    spring aop4.3.10

    7. **注解驱动的AOP**:从Spring 2.5开始,可以使用注解来声明切面和通知,无需XML配置。`@Aspect`、`@Pointcut`、`@Before`等注解使得AOP的使用更加直观和简洁。 8. **AOP应用场景**:Spring AOP广泛应用于事务...

    官方原版完整包 spring-framework-5.3.6.RELEASE-dist.zip

    此外,这个包可能还包括其他相关组件,如Spring Expression Language (SpEL) 和Spring Test,用于测试和配置Spring应用。 2. spring-5.3.6-docs.zip:这个文件提供了Spring Framework 5.3.6.RELEASE的官方文档。...

Global site tag (gtag.js) - Google Analytics