`

Spring使用XML方式实现AOP

阅读更多

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。

首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.

1、实体bean

public class Person {

	private Long id;
	private String name;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

  2、接口类

public interface PersonService {
	public void save(Person person);
	
	public void update(Person person); 
	
	public Person getByIdPerson(Long id);
	
	public void delete(Long id);
}

  3、实现类

public class PersonServiceImpl implements PersonService{

	Map<Long, Person> maps = new HashMap<Long, Person>();
	
	@Override  
    public void save(Person person) {
        System.out.println("***执行save方法***");
        maps.put(person.getId(), person);
    }  
  
    @Override  
    public void update(Person person) {  
        System.out.println("***执行update()方法***");
        maps.remove(person.getId());
        maps.put(person.getId(), person);
    }  
  
    @Override  
    public Person getByIdPerson(Long id) {  
        System.out.println("***执行getByIdPerson()方法***");  
        return maps.get(id);
    }  
    
    @Override
    public void delete(Long id) {
    	System.out.println("***执行delete()方法***");  
    	maps.remove(id);
    }
}

 4、定义Aspect

public class MyInterceptor {

	/**在核心业务执行前执行,不能阻止核心业务的调用*/
    public void doBefore(JoinPoint joinPoint) {
    	//可通过joinPoint来获取所需要的内容
    	Object[] objects = joinPoint.getArgs();
    	Person person = (Person) objects[0];
    	System.out.println("前置通知:"+person.getName()); 
    }  
      
    /** 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice @param joinPoint */  
    public void doAfter(JoinPoint joinPoint) {  
    	System.out.println("最终通知"); 
    }  
      
    /** 
     * 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice 
     * @param joinPoint 
     */  
    public void doAfterReturning(JoinPoint joinPoint) {  
    	System.out.println("后置通知");
    }  
      
    /**异常通知*/  
    public void doAfterThrowing(Throwable ex) {  
        System.out.println("异常通知:"+ex.getMessage());  
    }  
    
    /**环绕通知*/
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {  
    	System.out.println("进入环绕通知");  
		Object object = pjp.proceed();//执行该方法  
		System.out.println("退出方法");   
        return object;  
    }  
}  

 5、在Spring的XML配置文件中配置AOP

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	
    <context:annotation-config />
	<context:component-scan base-package="cn.tzz.aop.annotation" />
	
	<!--AOP 注解 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />
	<bean id="personService" class="cn.tzz.aop.annotation.service.impl.PersonServiceImpl"></bean>
	<bean id="myInterceptor" class="cn.tzz.aop.annotation.MyInterceptor"></bean>
	<!--XML 注解 -->
	<bean id="personXmlService" class="cn.tzz.aop.xml.service.impl.PersonServiceImpl"></bean>
	<bean id="myXmlInterceptor" class="cn.tzz.aop.xml.MyInterceptor"></bean>
	<aop:config>  
        <aop:aspect id="aspect" ref="myXmlInterceptor">
			<!--定义切点 -->
            <aop:pointcut id="myPoint" expression="execution(* cn.tzz.aop.xml.
service.impl..*.*(..))"/>
              
            <aop:before method="doBefore" arg-names="person" pointcut-ref="myPoint"/>  
            <aop:after method="doAfter"  pointcut-ref="myPoint"/>  
            <aop:after-returning method="doAfterReturning"  pointcut-ref="myPoint"/>  
            <aop:after-throwing method="doAfterThrowing" throwing="ex" 
pointcut-ref="myPoint"/>  
            <aop:around method="doAround"  pointcut-ref="myPoint"/>  
        </aop:aspect>  
    </aop:config>     
</beans>

 

  6、测试

public class TestAop {

	private static ApplicationContext ctx = null;
	private static PersonService personService = null;
	
	static{
	 ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	 personService = (PersonService)ctx.getBean("personXmlService");
	}
	
	public void testSave(){
		Person person = new Person();
		person.setId(1L);
		person.setName("abc");
		personService.save(person);
	}
	
	public void testGetByIdPerson(){
		Person p = personService.getByIdPerson(1L);
		System.out.println(p.getId()+"---"+p.getName());
	}
	
	public void testUpdate(){
		Person person = new Person();
		person.setId(1L);
		person.setName("abc_1");
		personService.update(person);
	}
	
	public void testDelete(){
		personService.delete(1L);
	}
	
	@Test  
    public void testInteceptor(){  
		testSave();
//		testGetByIdPerson();
//		testUpdate();
//		testGetByIdPerson();
//		testDelete();
//		testGetByIdPerson();
    }  
}

 7、测试结果

前置通知:abc
进入环绕通知
***执行save方法***
最终通知
后置通知
退出方法

 

分享到:
评论

相关推荐

    SpringXML方式实现AOP demo

    标题 "SpringXML方式实现AOP demo" 涉及到的是使用Spring框架通过XML配置来实现面向切面编程(AOP)的知识。面向切面编程是Spring框架的一个核心特性,它允许开发者在不修改原有业务代码的情况下,对系统进行横切...

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

    Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...

    spring_aop xml方式实现aop

    XML配置是Spring AOP早期常用的一种配置方式,虽然在Spring 4.3之后推荐使用注解式AOP,但理解XML配置对于深入学习AOP仍然很有帮助。下面我们将详细讨论如何通过XML配置实现Spring AOP。 首先,我们需要在Spring...

    Spring通过XML实现AOP

    **Spring AOP 通过 XML 配置实现** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称 AOP)是一种强大的设计模式,它允许我们把关注点分离到所谓的“切面”中,这些切面独立于业务逻辑,但又与业务...

    使用Spring配置文件实现AOP

    这篇教程将详细讲解如何通过Spring的配置文件来实现AOP。 一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...

    Spring 基于基于XML配置方式实现AOP

    本篇文章将重点讲解如何通过XML配置方式在Spring中实现AOP。 首先,了解AOP的基本概念是必要的。AOP的核心是切面(Aspect),它封装了多个相关操作,形成了一个关注点。切点(Pointcut)定义了这些操作应用到何处,...

    SpringAop xml方式配置通知

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

    spring xml方式配置aop

    在Spring框架中,AOP(面向切面...总之,Spring XML方式配置AOP涉及定义切入点、通知和切面,以及设置bean来实现通知逻辑。虽然现在更多地使用注解驱动的AOP,但理解XML配置有助于深入理解AOP的核心概念和工作原理。

    spring aop xml 实例

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

    javaXML方式实现SpringAop编程(源码+jar包)

    在Java开发领域,Spring框架是不可或缺的一部分,而Spring AOP(面向切面编程)则是Spring框架中的重要特性,它提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何通过XML...

    Xml文件配置实现AOP通知

    通过Spring的XML配置,我们可以灵活地定义和实现AOP通知,包括前置、后置、返回后、异常后以及环绕通知。这使得我们可以将横切关注点与业务逻辑分离,提高代码的可维护性和复用性。Spring的AOP功能强大且易于使用,...

    XML方式实现AOP编程

    在Spring框架中,AOP提供了强大的支持,可以使用XML配置或者注解的方式来实现。本篇主要探讨使用XML配置实现AOP。 **一、理解AOP核心概念** 1. **切面(Aspect)**:切面是关注点的模块化,它结合了“通知”...

    Xml配置实现AOP

    通过研究这些示例,你可以更好地理解和应用这两种AOP实现方式。 总结来说,XML配置在Spring AOP中扮演着核心角色,它允许我们精细控制切面的定义、通知的执行时机以及代理的生成方式。无论是基于代理还是自动代理,...

    spring aop xml实现

    XML配置是Spring AOP早期版本中主要的配置方式,虽然在Spring 4.x及以后版本中,基于注解的配置更加常见,但理解XML配置仍然是学习AOP的基础。 首先,我们需要了解AOP的基本概念: 1. 切面(Aspect):一个关注点的...

    Spring 基于注解方式实现AOP

    在Spring框架中,基于注解的AOP(面向切面编程)是一种强大的工具,它允许开发者无需编写XML配置即可实现切面。这种编程方式极大地提高了代码的可读性和可维护性。下面我们将深入探讨如何使用注解来实现Spring AOP。...

    使用Spring的注解方式实现AOP入门

    本教程将引导您入门Spring的注解式AOP实现。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注点,如日志记录。切点(Pointcut)定义了在何时应用这些关注点,通常是一个方法调用...

    spring注解方式实现aop

    在Spring中,AOP主要分为两种实现方式:基于XML配置和基于注解。本示例主要探讨注解方式。 1. **定义切面(Aspect)** 切面是关注点的模块化,它包含通知(Advice)和切入点(Pointcut)。在Spring中,我们可以...

    Spring实现AOP的4种方式

    在Spring的XML配置文件中,可以使用&lt;aop:config&gt;元素来定义切面,&lt;aop:pointcut&gt;定义切点表达式,&lt;aop:advisor&gt;定义通知,&lt;aop:aspect&gt;定义切面。这种方式虽然相对繁琐,但清晰地展示了各个组件之间的关系,对于...

    Spring AOP 的实现例子(基于XML配置实现)

    XML配置是Spring AOP早期的主要实现方式,虽然现在有更简洁的注解式配置,但理解XML配置方式对于深入理解AOP原理仍然很有帮助。下面我们将详细探讨如何通过XML配置实现Spring AOP。 首先,我们需要在Spring配置文件...

Global site tag (gtag.js) - Google Analytics