`
wh007_cx
  • 浏览: 29338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【原创】spring 3 AOP配置

 
阅读更多

Spring AOP的配置可以采用两种方式:XML和Annotation(需要JDK 5.0+)。

 

1.以XML方式配置:

 

业务逻辑类BusinessServiceImpl .java:

package org.wh.tech.spring.aop;

import org.springframework.beans.factory.annotation.Autowired;
import org.wh.tech.spring.sample.SimpleBean;

/**
 * @Author:wh007
 * 
 * @Date:2011-7-4
 *
 * @TODO:业务逻辑类
 */
public class BusinessServiceImpl implements BusinessService {

	@Autowired
	private SimpleBean simpleBean;

	@Override
	public void addProcess(String processName) {
		simpleBean.print(processName + " is added !") ;
	}

	@Override
	public boolean updateProcess(String processName) {
		simpleBean.print(processName + " is updated !") ;
		return true;
	}

}

 

 

XML切面类XMLExampleAspect.java:

package org.wh.tech.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @Author:wh007
 * 
 * @Date:2011-7-4
 * 
 * @TODO:XML配置切面类
 */

public class XMLExampleAspect {

	
	/*
	 * Around advice: 执行在join point这个方法执行之前与之后的advice。
	 */
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
		long time = System.currentTimeMillis();
		Object retVal = pjp.proceed();
		time = System.currentTimeMillis() - time;
		System.out.println("process time: " + time + " ms");
		return retVal;
	}

	/*
	 * After advice: 执行在join point这个方法执行之后的advice。
	 */
	public void doAfter(JoinPoint jp) {
		System.out.println("log Ending method: "
				+ jp.getTarget().getClass().getName() + "."
				+ jp.getSignature().getName());
	}

	
	/*
	 * Before advice: 执行在join point这个方法执行之前的advice。
	 */
	public void doBefore(JoinPoint jp) {
		System.out.println("log Begining method: "
				+ jp.getTarget().getClass().getName() + "."
				+ jp.getSignature().getName());
	}

	/*
	 * Throwing advice: 执行在join point这个方法抛出异常之后的advice。
	 */
	public void doThrowing(JoinPoint jp, Throwable ex) {
		System.out.println("method " + jp.getTarget().getClass().getName()
				+ "." + jp.getSignature().getName() + " throw exception");
		System.out.println(ex.getMessage());

	}
}

 

 

测试类TestXmlAop.java

 

package org.wh.tech.spring.aop.test;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.wh.tech.spring.aop.BusinessService;

/**
 * @Author:wh007
 * 
 * @Date:2011-7-4
 *
 * @TODO:以XML方式配置Aop测试
 */

@ContextConfiguration(locations={"classpath:applicationContext-*.xml"})
public class TestXmlAop  extends AbstractJUnit4SpringContextTests{
	
	@Autowired
	private BusinessService businessService;
	
	@Test 
	public void testAddProcess(){
		businessService.addProcess("1st,");
	}

}

 

applicationContext.xml需要配置:

	<!-- 以XML方式配置Aop -->
	<aop:config>
		<aop:aspect id="xmlAspect" ref="xmlAspectBean">
			<aop:pointcut id="businessService"
				expression="execution(* org.wh.tech.spring.aop.*.*(..))" />
			<aop:after pointcut-ref="businessService" method="doAfter" />
			<aop:before pointcut-ref="businessService" method="doBefore" />
			<aop:around pointcut-ref="businessService" method="doAround" />
		</aop:aspect>
	</aop:config>

	<bean id="xmlAspectBean" class="org.wh.tech.spring.aop.XMLExampleAspect" />
	<bean id="businessServiceImpl" class="org.wh.tech.spring.aop.BusinessServiceImpl"></bean>

 

2.以Annotation方式配置:

 

切面类AnnotationExampleAspect.java:

package org.wh.tech.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.wh.tech.spring.sample.SimpleBean;

/**
 * @Author:wh007
 * 
 * @Date:2011-7-4
 *
 * @TODO:通过annotation注解配置aop
 */

@Aspect
public class AnnotationExampleAspect {

	@Autowired
	private SimpleBean simpleBean;
	
	
	/*
	 * 定义pointcunt
	 * */
	@Pointcut("execution(* org.wh.tech.spring.aop.*.*(..))")   
	public void aPointcut() {
		
	} 
	
	
	/*
	 * After-Returning advice: 执行在join point这个方法抛出异常之后的advice。
	 */
	@AfterReturning(pointcut = "aPointcut()", returning="r")
	public void doAfterReturning(boolean r) {
		if(r){
			simpleBean.print("return is :" + r);
		}else{
			simpleBean.print("r is null");
		}
	}
	
}

 

 

测试类TestAnnotationAop.java:

package org.wh.tech.spring.aop.test;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.wh.tech.spring.aop.BusinessService;

/**
 * @Author:wh007
 * 
 * @Date:2011-7-4
 *
 * @TODO:以Annotation方式配置Aop测试
 */

@ContextConfiguration(locations={"classpath:applicationContext-*.xml"})
public class TestAnnotationAop extends AbstractJUnit4SpringContextTests {
	
	@Autowired
	private BusinessService businessService;
	
	@Test
	public void testUpdateProcess(){
		businessService.updateProcess("update,");
	}
}

 

 

applicationContext.xml只需添加:

	<!-- 以annotation方式配置Aop -->
	<aop:aspectj-autoproxy />
	<bean id="annotationExampleAspect" class="org.wh.tech.spring.aop.AnnotationExampleAspect" />

 

3.小结:

两种方式各有优势:

1)XML方式灵活性更高,一旦出现配置变更,只需要修改配置文件而不需要程序进行改动,但配置较为复杂。

2)Annotation方式配置较为简洁,但变更成本较高,需要对程序进行修改。

分享到:
评论

相关推荐

    spring aop 经典例子(原创)

    在`testaop`这个文件夹中,可能包含了一个简单的Spring配置文件(如`applicationContext.xml`),用于定义Bean和AOP配置。在配置文件中,我们需要声明一个切面类,该类包含了我们定义的通知。例如: ```xml &lt;aop:...

    [原创]Spring Batch 示例程序

    Spring 3提供了与Spring Batch的紧密集成,使得配置和使用变得更加简单。通过XML配置或者更现代的Java配置,开发者可以定义Job和Step的结构,以及它们之间的关系。Spring的依赖注入(DI)和AOP特性也能够应用于...

    spring_2021.7.14.zip

    3. "spring01quickstart.zip":这是Spring框架的基础快速启动教程,可能涉及到Spring的核心概念,如IoC容器、bean的生命周期、AOP(面向切面编程)等。这部分可能会介绍如何创建第一个Spring应用,包括引入Spring库...

    spring 重点知识原创

    3. **配置文件与 Bean**:在 Spring 应用中,通常会有一个或多个 XML 配置文件(如 `applicationContext.xml`),这些文件定义了 Spring 容器管理的 bean 及其依赖关系。每个 `&lt;bean&gt;` 元素表示一个对象实例,`id` ...

    Spring最新的jar包3.1.0

    3. **环境感知配置**:Spring 3.1.0引入了`@Profile`注解,使得开发者可以为不同的运行环境(如开发、测试、生产)创建特定的配置。这样,只需根据当前环境激活相应的配置,即可实现配置的动态切换。 4. **自动配置...

    让Spring之父Rod Johnson拍案叫绝的原创经典(spring解密)

    3. **AOP(面向切面编程)**:Spring的另一个重要特性是AOP,它允许我们定义横切关注点,如日志、事务管理等,并将它们模块化,独立于业务逻辑。这样,我们可以编写更简洁、更专注的代码。 4. **Bean管理**:Spring...

    Ext+Spring+Hibernate(原创送给javaeye朋友)

    3. **Spring AOP**:了解如何使用Spring的切面编程实现日志记录、事务管理等跨切面关注点。 4. **Spring DI**:掌握依赖注入的概念和实践,如何通过XML或注解方式声明和管理bean。 5. **Hibernate ORM**:学习实体...

    使用spring的quartz定时器要用到的jar包

    3. `spring-beans.jar` 和 `spring-core.jar`:Spring的基本组件,用于定义bean和核心工具类。 4. `spring-aop.jar`(可选):如果需要AOP(面向切面编程)支持,例如在定时任务中加入事务管理,那么这个jar包是必要...

    原创struts2+spring2+hibernate3的simple示例

    这个"原创struts2+spring2+hibernate3的simple示例"是一个典型的三层架构整合应用,旨在帮助开发者理解如何将这三个框架集成并实现基本的查询和插入功能。 1. **Struts2**: 是一个开源的MVC框架,负责处理HTTP请求...

    A4j 原创小案例+Spring+hibernate

    【标题】:“A4j 原创小案例+Spring+Hibernate”是一个综合性的IT学习资源,涵盖了多个关键的技术框架,旨在帮助用户理解和实践这些技术的整合应用。 【描述】:“个人做的 小例子 A4j Myfaces JSF Spring ...

    SSH 整合原代码 包括2种方式:注解&xml;配置 (已测试, 原创)

    本资源提供的是SSH整合的原代码,涵盖了通过注解和XML配置两种方式进行整合的方法,并且已经过测试,确保其可行性和原创性。以下是关于SSH整合及这两种配置方式的详细知识: 1. **Struts框架**:Struts是一个基于...

    梦之都辛星Spring4.x参考资料

    Spring框架具有良好的设计理念,许多设计思想虽不是其原创,但在Spring中得到了很好的应用。例如: - 低侵入式设计:提高复用性,不强制依赖特定接口或类。 - 依赖注入(DI):降低组件间的耦合性,提高系统的...

    [浪曦原创]Struts2.Hibernate3.2.Spring2.0整合(风中叶)

    而Spring框架则是提供了一个全面的后端服务支持,包括依赖注入、AOP(面向切面编程)、事务管理等。 在"浪曦原创"的这个教程中,"风中叶"老师将指导我们如何将这三个框架进行深度整合,构建一个高效的企业级应用。...

    AspectJ+Spring编程(原创)

    AspectJ和Spring框架的结合,为Java开发者提供了强大的AOP支持,使得我们可以更优雅地处理系统中的横切关注点,如日志、事务管理等。本文将深入探讨AspectJ与Spring的整合,以及如何在实际项目中运用它们。 首先,...

    Spring框架学习.pdf

    Spring框架使得JAVA EE更加易于使用,它主要是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。 Spring框架的优点众多。首先,它让Java EE应用开发变得更简单。Spring使用基本的JavaBean来完成之前...

    【原创】Mybatis学习笔记(一)——Spring集成Mybatis

    在本篇【原创】Mybatis学习笔记(一)——Spring集成Mybatis中,我们将探讨如何将流行的持久层框架Mybatis与Spring框架进行整合,以便在实际项目开发中实现灵活、高效的数据库操作。以下是对相关知识点的详细说明: ...

    Struct1.2-Spring1.2-IBatis2.1.6 原创 实例

    接着,"Spring1.2"是Spring框架的一个早期版本,这是一个全面的后端开发框架,包含了依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)、数据访问、事务管理等众多功能。...

    Spring.net+NHibernate示例源码【Rugate原创】

    为了运行和理解这个示例,开发者需要熟悉Spring.NET的配置文件(如Spring.sdf或Spring.xml),这些文件定义了bean的实例化、依赖关系和AOP规则。同时,他们还需要了解NHibernate的映射文件(.hbm.xml)以及如何设置...

    原创经典实例spring+mybatis+分页+百万数据

    总的来说,这个"原创经典实例spring+mybatis+分页+百万数据"涵盖了Spring框架的使用、MyBatis的映射方式、以及大数据量下的分页策略。无论你是初学者还是经验丰富的开发者,都可以从中受益,提升自己的技能水平。...

    [浪曦原创]Struts2.Hibernate3.2.Spring2.0整合续二(风中叶)

    在"浪曦原创"的教程中,"浪曦OA与工作流系统 第3讲 Struts2+Hibernate3.2+Spring2.0整合续二(风中叶)"很可能是对这一整合过程的深入讲解。通常,整合过程包括以下步骤: 1. 引入相关库:在项目中添加Struts2、...

Global site tag (gtag.js) - Google Analytics