在Spring中aop是一个重要的特性。和Hibernate结合的事务控制使用的就是aop,下面看如何使用。
首先定义一个增强(即通知),这是在被代理的方法执行前或执行后先执行增强中的代码再去执行被代理的方法。增强包括前置增强、后置增强、环绕增强、异常抛出增强和引介增强。
下面看一个前置增强
package com.maxjay.bank.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
/**
* 日志记录 前置增强
*
* @author Administrator
*
*/
public class LoggerBeforeAdvice implements MethodBeforeAdvice {
/**
* 当被代理对象的方法执行前,此方法被执行
*
* @param method
* 目标类方法
* @param args
* 方法的参数
* @param obj
* 目标类实例
*/
public void before(Method method, Object[] args, Object obj)
throws Throwable {
// if (method.getName().indexOf("validateUser") != -1) { // 由advisor(切面)来定义对那些方法进行拦截
System.out.println("日志记录开始,将要运行的方法为"
+ obj.getClass().getSimpleName() + "." + method.getName());
// }
}
}
在applicationContext-aop.xml中定义这个增强
<!-- 使用AOP进行日志记录,定义增强 -->
<bean id="loggerBeforeAdvice" class="com.maxjay.bank.advice.LoggerBeforeAdvice" />
使用ProxyFactoryBean配置,让spring来产生这个增强后的代理bean
<!--
配置单个bean的代理,在使用时不能用原有bean的id要用AppContext.get("singleLoginProxy")从context中获取(见测试类LoggerAdviceTest)
-->
<bean id="singleLoginProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.maxjay.bank.service.UserService</value>
</property>
<property name="interceptorNames">
<list>
<value>loggerBeforeAdvice</value>
</list>
</property>
<property name="target">
<ref bean="userService" />
</property>
<!-- 设置是否直接代理类(默认为false):true即使用cglib生成代理类,此时target对象不可以JDK动态代理过的bean;false则使用JDK动态代理 -->
<property name="proxyTargetClass">
<value>true</value>
</property>
</bean>
上面这段代码中的userService是普通的service类,它实现了UserService接口。这段配置就是要产生userService的代理类,而且采用的是cglib代理的方式,因此这个userService不能是JDK已经动态代理过的bean。由于我配置的这个userService已经加上了事务控制的aop增强,而且一般情况下声明式事务产生的是jdk动态代理的bean,因此会报一个无法代理的异常。如果要使用这个userService,就必须在声明事务的地方设置属性optimize为true,意思是强制使用cglib生成其代理的bean。具体配置如下:
<!-- 事务代理 -->
<bean id="baseTransaction" lazy-init="true" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="modify*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="read*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
<!-- 设置强制使用CGLIB生成代理 -->
<property name="optimize" value="true" />
</bean>
userService的配置如下:
<bean id="userService" parent="baseTransaction">
<property name="target">
<bean
class="com.maxjay.bank.service.impl.UserServiceImpl">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
</property>
</bean>
测试类:
package test.com.maxjay.bank.advice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.maxjay.bank.service.UserService;
public class LoggerAdviceTest {
public static void main(String[] args) {
String[] paths = { "web/WEB-INF/applicationContext.xml",
"web/WEB-INF/applicationContext-dao.xml",
"web/WEB-INF/applicationContext-service.xml",
"web/WEB-INF/applicationContext-aop.xml" };
ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
UserService service = (UserService) ctx.getBean("singleLoginProxy");
service.validateUser("zxm", "zxm");
//service.getAllUsers();
}
}
此时控制台会打印:
日志记录开始,将要运行的方法为UserServiceImpl$$EnhancerByCGLIB$$3b846ea.validateUser
可以看出在调用UserService的方法时已经加入了我们想要增加的日志记录方法,到此可以学会增强的配置方法了...
分享到:
相关推荐
以下是一个简单的Spring AOP配置文件示例: ```xml <aop:config> <aop:aspect id="loggingAspect" ref="loggingAdvice"> <aop:before method="beforeMethod" pointcut-ref="businessMethods"/> <aop:after-...
2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...
Spring AOP配置 在Spring XML配置文件中,可以声明切面和通知,如下: ```xml <aop:config> <aop:aspect id="loggingAspect" ref="loggingService"> <aop:before method="logBefore" pointcut="execution(* ...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
Spring AOP(Aspect-Oriented Programming,面向方面编程)是一种编程范式,它允许开发者在不修改源代码的情况下,增强和修改应用程序的行为。 Spring AOP 提供了一种灵活的方式来实现事务管理,通过配置事务特性和...
在给定的配置文件中,我们看到了一个典型的Spring AOP配置实例。接下来我们将对这段配置进行详细的分析与解读。 ##### 2.1 配置文件头 ```xml ``` 这是XML文档的声明部分,指明了文档采用的XML版本为1.0,并且...
Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下对程序进行功能增强的技术。在Java应用程序中,AOP主要用于日志记录、性能统计、安全控制、事务管理等...
- **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
**Spring AOP配置实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心组件之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP允许开发者定义“切面”,这些...
Spring AOP配置 Spring AOP的配置可以通过XML或注解方式进行: - **XML配置**: - 在`<aop:config>`标签内定义切面,`<aop:pointcut>`定义切入点,`<aop:advisor>`定义通知。 - `<aop:aspect>`标签用于定义完整...
通过上述步骤,我们成功地使用Spring AOP配置了一个切面,用于在`DukePerformer`的表演前后执行观众的特定行为。这不仅增强了代码的可读性和可维护性,还体现了面向切面编程的核心思想——将横切关注点从业务逻辑中...
【Spring AOP 详细介绍】 Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不修改源代码的情况下,对应用程序进行功能增强的能力。AOP的核心概念包括Advice...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,通过插入额外的代码(称为切面)来增强应用程序功能的方式。在Spring MVC框架中,AOP通常用于实现日志记录、事务管理...
Spring AOP,全称Spring面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对程序进行功能增强的技术。在实际开发中,我们经常使用AOP来处理如日志记录、事务管理、权限校验...
Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下对程序进行扩展和增强的方法。在Java应用中,AOP主要用于日志记录、性能统计、安全控制、事务管理等方面...