前段时间研究了Spring的AOP功能,觉得这个功能挺不错的,希望有机会可以用到自己的项目中。正好这个时候正在做的一个项目需要日志管理的功能,我不想和以前的做法一样,把日志功能的代码直接和业务逻辑的代码交织在一起,这样做不但不利于后期的维护,还可能影响系统的逻辑功能。舍弃了这种做法,AOP就可以派上用场了。
但实际使用的时候发现,AOP也不是书上讲的那么容易,期间遇到了很多问题需要解决。现在我把遇到的问题列举如下:
(1)项目中是使用了事物的,是通过spring实现的。刚开始没有考虑到系统要用AOP的时候,实现事务的功能是直接在spring容器中配置一个含有事务功能的抽象类,然后所有需要事务功能的类就继承这个类。现在涉及到AOP了,就需要拦截这些继承了事务功能的类的某些方法以便做日志记录。但这样做了,spring容器就起不来了,总是抱错说添加了日志拦截功能的类无法初始化。试了很多次都不行,无奈只好到网上去找解决问题的办法了。功夫不负有心人,找了一个下午,终于找到了一些有用的资料。有一篇文章上给出的问题和我现在遇到的问题是很相似的,但没有给出引起这种错误的具体原因,只是给出了解决问题的方法,按找这种方法试了,spring容器真的不再出现这种问题,顺利启动了,而且可以实现相应的功能。方法很简单,就是实现事务的方式由继承改成AOP代理就可以了,使用的是注解的方式。这样做管理事务就更加方便了,直接去掉代理就可以了,不用在每个bean里面去掉abstract属性这样麻烦。关键代码如下:
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="up*" propagation="REQUIRED"/>
<tx:method name="import*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- aop代理设置 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="txPointcut" expression="execution(* cn.ipanel.apps.cms..service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
在这种情况下,日志记录的方式,我也用注解的方式实现了。通过这种方式,日志逻辑和业务逻辑就较好的分开了,方便日志代码的维护管理。
(2)但AOP注解的方式并不是任何方法都可以拦截,我在拦截Action中的方法是就遇到了这个问题,不管怎样试,拦截的方法都不起作用,且没有任何报错的信息。这让我非常苦恼,差点就要放弃了。无可奈何之下,带着这个问题请教了一个老同事,他看了几下配置文件后指出,struts中的Action没有实现接口,导致AOP无法发挥作用的关键。现在解决的办法有两个:一是为每个Action实现一个接口,然后就可以用这种方式了,但这样做觉得很别扭,且失去了接口的意义了,纯粹为了AOP 的情况下。基于以上考虑,放弃了这种方式。二是不用注解,采用Proxy的方式,可以顺利解决问题,但必须为每个Action类配置一个代理bean,很繁琐。在没有想到更好的方式之下,我就采用了第二中方法。通常记录日志都需要用户信息,在Action中就很容易得到这类信息,所以我才采取在Action层进行拦截的方式,虽然知道这种方式不好,但没办法。不然的话,只能为每个service方法传递一个user的对象了,但当初没有考虑到这个,现在实现起来也要做很多的修改,所以放弃了。配置文件中关键代码摘抄如下:
<bean name="/module/importXml"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="importAndExportXml" />
</property>
<property name="interceptorNames">
<value>importAndExportNodeXmlLoginfoAdvice</value>
</property>
<property name="proxyTargetClass" value="true"/>
</bean>
上面就是我在项目中应用AOP时遇到的主要问题,都解决了,希望可以对其他的人有帮助。
分享到:
相关推荐
**Spring AOP应用Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个Demo是针对Spring AOP的...
**Spring AOP 应用详解** Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在程序运行时动态插入代码的能力,以实现跨切面的关注点,如日志、事务管理、权限控制...
本资料"Java进阶之SpringAOP应用共16页.pdf"深入探讨了Spring AOP在实际开发中的应用和实现原理,旨在提升Java开发者的技能水平。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它将关注点分离为不同的...
通过上述步骤,你可以创建一个简单的Spring AOP应用,实现对特定方法的调用进行日志记录。当然,AOP的潜力远不止于此,你可以根据实际场景扩展通知类型,或者创建更复杂的切入点表达式,以实现更细粒度的控制。 在...
在实际开发中,Spring AOP广泛应用于事务管理。例如,我们可以定义一个切面来处理所有数据库操作的事务,这样无需在每个业务方法中显式调用开始和提交事务,只需在切面中配置事务规则即可。 `aop-jar`这个压缩包...
在本示例中,"springaop.zip" 包含了一个使用XML配置的Spring AOP应用实例,可以直接运行,配合相关的博客文章学习效果更佳。 在Spring AOP中,我们首先需要了解几个核心概念: 1. **切面(Aspect)**:切面是关注...
另一个文件"testaop"是一个MyEclipse项目,包含了实际的Spring AOP应用实例。这个项目可以帮助你更好地理解如何在实际项目中集成和使用Spring AOP。你可以直接导入此项目到MyEclipse中,运行并观察AOP如何工作,例如...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
Spring框架是目前Java开发中使用最广泛的应用程序框架之一,它为开发企业级应用提供了全面的基础支持。其中,AOP(面向切面编程)是Spring框架的一个核心特性,它允许开发者将横切关注点(cross-cutting concerns)...
本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...
创建一个简单的Spring AOP应用,首先定义一个切面类,包含切点和通知,然后在Spring配置文件中启用AOP并注册切面,最后编写测试类验证AOP功能是否正常工作。 8. **最佳实践** - 适度使用AOP,过多的切面可能导致...
AOP的核心是切点(Pointcut),它定义了关注点在何处应用。在Spring中,我们通常使用表达式或者注解来定义切点。例如,我们可以使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等注解来...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
在这个"springAop-demo.zip"压缩包中,我们很可能会看到一个实际的Spring AOP应用示例,让我们来详细探讨一下Spring AOP的核心概念和使用方法。 1. **切面(Aspect)**:切面是Spring AOP的核心概念,它封装了多个...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的...通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大的工具,优化我们的应用程序。
这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如过滤器、监听器、JDBC等。 【描述】"SPRING AOP自主实现,还包括一些java基础,可以很快自主实现切面编程" 提示我们,此...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...