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" 涉及到的是使用Spring框架通过XML配置来实现面向切面编程(AOP)的知识。面向切面编程是Spring框架的一个核心特性,它允许开发者在不修改原有业务代码的情况下,对系统进行横切...
Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...
XML配置是Spring AOP早期常用的一种配置方式,虽然在Spring 4.3之后推荐使用注解式AOP,但理解XML配置对于深入学习AOP仍然很有帮助。下面我们将详细讨论如何通过XML配置实现Spring AOP。 首先,我们需要在Spring...
**Spring AOP 通过 XML 配置实现** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称 AOP)是一种强大的设计模式,它允许我们把关注点分离到所谓的“切面”中,这些切面独立于业务逻辑,但又与业务...
这篇教程将详细讲解如何通过Spring的配置文件来实现AOP。 一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的...
本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...
本篇文章将重点讲解如何通过XML配置方式在Spring中实现AOP。 首先,了解AOP的基本概念是必要的。AOP的核心是切面(Aspect),它封装了多个相关操作,形成了一个关注点。切点(Pointcut)定义了这些操作应用到何处,...
**Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...
在Spring框架中,AOP(面向切面...总之,Spring XML方式配置AOP涉及定义切入点、通知和切面,以及设置bean来实现通知逻辑。虽然现在更多地使用注解驱动的AOP,但理解XML配置有助于深入理解AOP的核心概念和工作原理。
本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时。 首先,我们需要在Spring的配置文件中启用AOP...
在Java开发领域,Spring框架是不可或缺的一部分,而Spring AOP(面向切面编程)则是Spring框架中的重要特性,它提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何通过XML...
通过Spring的XML配置,我们可以灵活地定义和实现AOP通知,包括前置、后置、返回后、异常后以及环绕通知。这使得我们可以将横切关注点与业务逻辑分离,提高代码的可维护性和复用性。Spring的AOP功能强大且易于使用,...
在Spring框架中,AOP提供了强大的支持,可以使用XML配置或者注解的方式来实现。本篇主要探讨使用XML配置实现AOP。 **一、理解AOP核心概念** 1. **切面(Aspect)**:切面是关注点的模块化,它结合了“通知”...
通过研究这些示例,你可以更好地理解和应用这两种AOP实现方式。 总结来说,XML配置在Spring AOP中扮演着核心角色,它允许我们精细控制切面的定义、通知的执行时机以及代理的生成方式。无论是基于代理还是自动代理,...
XML配置是Spring AOP早期版本中主要的配置方式,虽然在Spring 4.x及以后版本中,基于注解的配置更加常见,但理解XML配置仍然是学习AOP的基础。 首先,我们需要了解AOP的基本概念: 1. 切面(Aspect):一个关注点的...
在Spring框架中,基于注解的AOP(面向切面编程)是一种强大的工具,它允许开发者无需编写XML配置即可实现切面。这种编程方式极大地提高了代码的可读性和可维护性。下面我们将深入探讨如何使用注解来实现Spring AOP。...
本教程将引导您入门Spring的注解式AOP实现。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注点,如日志记录。切点(Pointcut)定义了在何时应用这些关注点,通常是一个方法调用...
在Spring中,AOP主要分为两种实现方式:基于XML配置和基于注解。本示例主要探讨注解方式。 1. **定义切面(Aspect)** 切面是关注点的模块化,它包含通知(Advice)和切入点(Pointcut)。在Spring中,我们可以...
在Spring的XML配置文件中,可以使用<aop:config>元素来定义切面,<aop:pointcut>定义切点表达式,<aop:advisor>定义通知,<aop:aspect>定义切面。这种方式虽然相对繁琐,但清晰地展示了各个组件之间的关系,对于...
XML配置是Spring AOP早期的主要实现方式,虽然现在有更简洁的注解式配置,但理解XML配置方式对于深入理解AOP原理仍然很有帮助。下面我们将详细探讨如何通过XML配置实现Spring AOP。 首先,我们需要在Spring配置文件...