`

AOP_使用spring框架进行面向切面编程

 
阅读更多

用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容器管理

    需要注意切入点执行的方法的参数

            

分享到:
评论

相关推荐

    Spring-aop面向切面编程实例

    面向切面编程(Aspect-Oriented Programming,AOP)是Spring框架的核心特性之一,它提供了一种优雅的方式来处理系统的横切关注点,如日志、事务管理、性能监控和权限控制等。在Spring中,AOP主要通过代理模式实现,...

    Spring面向切面编程AOP

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...

    spring_AOP.rar_876.aop_java aop_spring_aop

    Spring AOP(面向切面编程)是Java开发中Spring框架的核心特性之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。在SSH(Struts、Spring、Hibernate)经典企业级开发框架中,Spring AOP扮演着至...

    spring使用动态代理面向切面编程(AOP) xml

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP...

    Spring示例_Printer_Spring_AOP_Spring_Proxy

    在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...

    Spring IOC和Spring AOP_spring aop_springIOC

    面向切面编程(AOP)是Spring框架的另一大特色,它允许程序员将关注点分离,比如日志记录、事务管理、安全检查等,可以编写一次,然后在整个应用中到处使用。AOP通过切面(Aspect)和通知(Advice)来实现。 1. **...

    面向切面编程aop简介

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架的重要组成部分,它提供了一种在不修改原有业务代码的基础上,插入额外功能的编程模型。Spring AOP使得开发者能够更方便地实现如日志记录、事务管理、...

    Spring-AOP java2ee中的Spring框架的面向切面示例

    在Java企业级开发中,Spring框架是一个不可或缺的重要组件,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程(AOP)、数据访问/集成、Web应用、事务管理等。本示例主要聚焦于Spring框架的面向切面编程(AOP...

    spring4 AOP 面向切面编程@Aspect

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    spring AOP切面编程

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...

    Spring AOP面向切面三种实现

    在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...

    16.2 Spring框架-AOP面向切面编程

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要组成部分,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、性能监控等。在传统的OOP(面向对象编程)中...

    AOP面向切面编程总结

    ### AOP面向切面编程详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,它作为OOP(面向对象编程)的一种补充,主要解决了OOP在处理横切关注点方面的不足。在传统的...

    Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP).doc

    面向切面编程(AOP),全称为 Aspect Oriented Programming,是Spring框架的重要特性之一,用于实现代码的解耦,提高可维护性和可复用性。AOP的核心思想是将关注点分离,将横切关注点(如日志、事务管理、性能监控)与...

    8_24_SpringAOP_springaop_

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本教程中,我们将深入探讨Spring AOP的基本概念、配置...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...

    spring的aop切面编程实例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下对应用程序的行为进行统一管理和控制。在本实例中,我们将深入探讨如何使用AspectJ技术和XML配置来实现AOP。 首先,了解...

Global site tag (gtag.js) - Google Analytics