第一步,创建通知。Spring中定义的五种形式的通知,分别是before、after-returning、after-throwing、around和introduction。我们可以定义一个通知类实现上述五种形式中的一种或几种。
第二步,定义切点和通知者。切点是一个或多个应该被切面使用的连接点。意在告诉程序在哪里使用第一步中创建的通知。Spring提供了正则表达式切点和AspectJ表达式切点:(org.springframework.aop.support.JdkRegexpMethodPointcut,org.springframework.aop.aspectj.AspectJExpressionPointcut)。然后将切点和通知关联到通知者。
<bean id="audienceAdvice" class="org.springsource.springidol.AudienceAdvice">
//AudienceAdvice为实现了五种通知接口中的某些接口的类
<property name="audience" ref="audience" />
</bean>
<bean id="pointcut" class="*.JdkRegexpMethodPointcut">
<property name="pattern" value=".*perform"/>
</bean>
<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="audienceAdvice"/>
<property name="pointcut" ref="performancePointCut"/>
</bean>
当然也有一些更为简洁的方法,不在本文的论述范围,本文是为了说明创建切面的过程。
第三步,最后定义代理类来代理目标bean的功能。
<bean id="jugglerProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="juggler"/>
<property name="interceptorNames" value="audiencePointcutAdvisor"/>
<property name="proxyInterfaces" value="org.springsource.springidol.Performer"/>
</bean>
当我们调用一个被通知的Bean上的方法是,首先调用的是代理上的方法,然后代理会使用切点来决定通知是否应该被应用,最后调用被通知的bean本省。
其中PoxyFactoryBean代理了juggler Bean的一些操作,interceptorNames则是说audiencePointcutAdvisor这个通知被用于bean juggler,而proxyInterfaces则告诉ProxyFactoryBean动态代理需要实现Performer接口(因为bean juggler实现了Performer接口,而通知是在切点perform()方法前后执行)。
ps:利用aop元素进行配置可以对配置文件进行精简,<aop:config>可以申明对什么样的bean的什么方法启用通知者,
<aop:config>
<aop:aspect ref="paula">
<aop:before
pointcut="execution(* *.perform(..))"
method="greetPerformer"/>
<aop:after-returning
pointcut="execution(* *.perform(..))"
method="saySomethingNice"/>
<aop:after-throwing
pointcut="execution(* *.perform(..))"
method="saySomethingNiceAnyway"/>
</aop:aspect>
</aop:config>
(不需要在代码中增加标注)
还有一种方式是使用@Aspect标注,只需在配置文件中添加:
<aop:aspectj-autoproxy />,然后再代码中编写标注。
分享到:
相关推荐
总结一下,这个"spring切面小例子"展示了如何在Spring中使用注解实现AOP。通过定义切面、切点和通知,我们可以将非业务逻辑的关注点如日志记录与核心业务代码解耦,使得代码更清晰,维护性更强。这个例子对于理解和...
- 当我们创建自定义切面并通过`@Aspect`注解将其标记为切面时,如果没有正确地处理事务管理器和切面之间的关系,可能会导致事务失效。 - 默认情况下,Spring 的AOP代理模型在处理事务时,如果目标对象实现了接口...
Spring框架的AOP(面向切面编程)是其核心特性之一,它允许开发者在不修改原有代码的情况下,通过切面来插入额外的功能,比如日志记录、事务管理、性能监控等。在Spring AOP中,主要涉及到两个重要的库:...
而@AspectJ是Spring AOP的一个强大扩展,它允许使用声明式的方式定义切面,简化了AOP的实现过程。 #### 2. **配置AspectJ自动代理** 在Spring配置文件中,可以通过`<aop:aspectj-autoproxy/>`标签启用AspectJ的...
6. **代理(Proxy)**:Spring AOP通过创建代理对象来实现切面功能。有JDK动态代理和CGLIB代理两种方式。如果目标类实现了接口,Spring会使用JDK动态代理;如果没有,Spring会使用CGLIB生成一个子类来作为代理。 在...
5. 织入(Weaving):将切面应用到目标对象来创建新的代理对象的过程。 二、Spring AOP实现方式 1. 动态代理:当目标对象实现了接口时,Spring使用JDK动态代理生成一个代理对象,实现在方法调用前后添加通知功能。 ...
### Spring AOP 实现简单切面及测试 #### 一、引言 在软件开发过程中,经常遇到一些横切关注点的问题,例如日志记录、性能监控等,这些功能往往贯穿于应用程序的多个模块中。面向切面编程(Aspect Oriented ...
Spring切面编程是Spring框架中的一个重要特性,它实现了面向切面的编程(AOP),这是一种设计模式,旨在提高代码的可重用性、模块化和可维护性。在AOP中,切面是关注点的一个模块化,这些关注点通常包括日志、事务...
5. **织入(Weaving)**:织入是将切面应用到目标对象并创建一个代理对象的过程。这个过程可以在编译时、类加载时或运行时完成。Spring支持在运行时动态地将切面织入到Java代理对象中。 在Spring框架中,AOP主要...
在Spring中,我们可以通过定义一个带有注解的类来创建切面,这个类通常包含多个通知方法。 通知(Advice)是切面在特定连接点上执行的代码。在我们的模拟实现中,我们将创建四个不同类型的Advice: 1. **前置通知*...
在IT领域,Spring框架是Java开发中的核心组件之一,它为开发者提供了许多强大的功能,包括依赖注入、面向切面编程(AOP)以及事务管理。本章将详细探讨Spring4中的切面事务处理、事物通知以及传播行为。 一、切面...
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
5. **织入(Weaving)**:织入是将切面应用到目标对象,创建代理对象的过程。Spring支持三种织入方式:编译时织入、类加载时织入和运行时织入。其中,最常见的是运行时织入,它在Spring容器初始化bean时动态创建代理...
在IT行业中,Spring MVC、MyBatis Plus以及AOP(面向切面编程)是Java Web开发中的重要组件,常用于构建高效、灵活的企业级应用。本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责:Struts2主要用于MVC(模型-视图-控制器)架构的实现,Spring提供了强大的依赖注入和面向切面编程功能,而Hibernate则是一个优秀的...
织入是把切面应用到目标对象上,创建代理对象的过程。 二、Spring中的动态代理 Spring支持两种类型的动态代理:JDK动态代理和CGLIB代理。JDK动态代理基于接口,适用于目标对象实现了至少一个接口的情况。CGLIB代理...
织入(Weaving)是将切面应用到目标对象以创建新的代理对象的过程。 在Spring中,AOP主要通过两种方式实现:基于接口的JDK动态代理和基于类的CGLIB代理。当目标对象实现了接口时,Spring会选择使用JDK动态代理;...
5. **织入(Weaving)**:将切面与目标对象连接的过程,可以在编译时、加载时或运行时完成。 在Spring中实现AOP,通常有两种方式: 1. **基于注解的AOP**:通过在方法上添加注解(如`@Before`、`@After`、`@Around`...
3. **织入(Weaving)**:实际将切面应用到目标对象的过程。Spring支持三种织入方式:编译时织入、加载时织入和运行时织入。Spring默认采用的是动态代理,即运行时织入,它通过创建代理对象来实现AOP的功能。 在...
Spring框架中的AOP模块提供了实现这一目标的工具,使得开发者可以轻松地创建和使用切面。 AOP的核心概念包括以下几个部分: 1. **切面(Aspect)**:切面是AOP的核心,它包含了业务逻辑和横切关注点。在Spring AOP...