Spring AOP提供了xml配置文件以及Annotation注解的方式更方便的进行AOP的配置。当然这两种方式的最大的好处是更好的降低了代码耦合性。
XML配置的示例工程代码:
和前面的工程相比,前置通知,后置通知那几个通知类没有了,所有的通知逻辑直接放到了AllLogAdvice类的方法里:
package com.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class AllLogAdvice {
private Logger logger = Logger.getLogger(AllLogAdvice.class);
// 此方法将作为前置通知
public void myBeforeAdvice(JoinPoint jionpoint) {
// 获取被调用的类名
String targetClassName = jionpoint.getTarget().getClass().getName();
// 获取被调用的方法名
String targetMethodName = jionpoint.getSignature().getName();
// 日志格式字符串
String logInfoText = "前置通知:" + targetClassName + "类的"
+ targetMethodName + "方法开始执行";
// 将日志信息写入配置的文件中
logger.info(logInfoText);
}
// 此方法将作为后置通知
public void myAfterReturnAdvice(JoinPoint jionpoint) {
// 获取被调用的类名
String targetClassName = jionpoint.getTarget().getClass().getName();
// 获取被调用的方法名
String targetMethodName = jionpoint.getSignature().getName();
// 日志格式字符串
String logInfoText = "后置通知:" + targetClassName + "类的"
+ targetMethodName + "方法开始执行";
// 将日志信息写入配置的文件中
logger.info(logInfoText);
}
// 此方法将作为异常通知
public void myThrowingAdvice(JoinPoint jionpoint, Exception e) {
// 获取被调用的类名
String targetClassName = jionpoint.getTarget().getClass().getName();
// 获取被调用的方法名
String targetMethodName = jionpoint.getSignature().getName();
// 日志格式字符串
String logInfoText = "异常通知:执行" + targetClassName + "类的"
+ targetMethodName + "方法时发生异常";
// 将日志信息写入配置的文件中
logger.info(logInfoText);
}
// 此方法将作为环绕通知
public void myAroundAdvice(ProceedingJoinPoint jionpoint) throws Throwable {
long beginTime = System.currentTimeMillis();
jionpoint.proceed();
long endTime = System.currentTimeMillis();
// 获取被调用的方法名
String targetMethodName = jionpoint.getSignature().getName();
// 日志格式字符串
String logInfoText = "环绕通知:" + targetMethodName + "方法调用前时间" + beginTime
+ "毫秒," + "调用后时间" + endTime + "毫秒";
// 将日志信息写入配置的文件中
logger.info(logInfoText);
}
}
4种通知功能用4个方法来完成了。aop.xml配置文件内容:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="myUserService" class="com.service.UserService"></bean> <!-- 定义日志通知,将日志切面交给Spring容器管理 --> <bean id="allLogAdvice" class="com.aop.AllLogAdvice"></bean> <!-- 进行aop配置 --> <aop:config> <!-- 配置日志切面 --> <aop:aspect id="logaop" ref="allLogAdvice"> <aop:pointcut id="logpointcut" expression="execution(* com.service.UserService.*(..))" /> <!-- 将LogAdvice日志通知中的myBeforeAdvice方法指定为前置通知 --> <aop:before method="myBeforeAdvice" pointcut-ref="logpointcut"/> <!-- 将LogAdvice日志通知中的myAfterReturnAdvice方法指定为后置通知 --> <aop:after-returning method="myAfterReturnAdvice" pointcut-ref="logpointcut"/> <!-- 将LogAdvice日志通知中的方法指定为异常通知 --> <aop:after-throwing method="myThrowingAdvice" pointcut-ref="logpointcut" throwing="e" /> <!-- 将LogAdvice日志通知中的方法指定为环绕通知 --> <aop:around method="myAroundAdvice" pointcut-ref="logpointcut"/> </aop:aspect> </aop:config> </beans>
定义pointcut的这句:
<aop:pointcut id="logpointcut" expression="execution(* com.service.UserService.*(..))" />
expression里的写法参考官网解释的
6.2.3.4节:http://docs.spring.io/spring/docs/2.0.8/reference/aop.html
除了用execution外,还可以用within,this等。
这篇文章解释也不错:http://blog.csdn.net/kkdelta/article/details/7441829
这儿第一个*通配符代表所有的返回值,第二个*代表所有方法,(..)表示任意的参数类型。也就是说com.service.UserService类下面的所有任意返回值,任意参数类型的方法都会被拦截。
再看看主测试类MainTest:
package com.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.IUserService; public class MainTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "aop.xml"); IUserService userService = (IUserService) context .getBean("myUserService"); userService.addUser("ton", 56); userService.deleteUser("ton"); } }
这儿得到UserService的bean不再需要一个代理,而是直接用UserService定义的bean。这样的好处就是如果下次要删除通知里的逻辑,不再需要日志的功能了,我不再需要改java文件,直接在配置文件里的有关切面的配置段去掉就可以了,很好的做到了为代码解耦。
工程代码文件在附件中。。。。
相关推荐
在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
总的来说,Spring 框架的这些核心组件——AOP、Beans、Context 和 MVC,通过 XML 配置文件实现了高度的灵活性和可扩展性,是现代企业级 Java 应用程序开发的基石。理解并熟练使用这些配置文件,是成为 Spring 开发者...
Spring AOP 是 Spring 框架中的一部分,它提供了一种实现 AOP 的方式。 在 Spring AOP 中,主要有两个概念:Aspect 和 Advice。Aspect 是一个模块,它封装了一个或者多个 Advice。Advice 是一个函数,它提供了某种...
XSD文件在Spring框架中主要用来验证和解析基于XML的配置文件,例如`beans.xml`,这些文件定义了bean的实例化、依赖注入、AOP切面等配置。 压缩包内的子文件"spring-aop-4.2.xsd.txt"可能是XSD文件的文本版本,方便...
- **注解驱动**:从4.0.0.RELEASE开始,Spring AOP支持完全基于注解的配置,大大减少了XML配置的复杂性。 3. **@Aspect注解与通知** - **@Aspect**:标记一个类为切面,包含通知和切入点定义。 - **@Before、...
**Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...
在Spring框架中,XML配置文件是早期版本中定义和管理bean的主要方式。这些XML配置文件依赖于特定的XSD(XML Schema Definition)文件来提供语法验证和代码编辑器的自动提示功能。在给定的压缩包中,包含了`spring-...
集成spring aop xml配置的必备文件,若想要application.xml中有aop节点提示,则必须添加spring-aop-3.0.xsd文件
本资源“spring-aop-xml.rar”提供了一个使用XML配置实现Spring AOP的小实验,下面将详细介绍相关知识点。 首先,我们需要理解AOP的核心概念: 1. **切面(Aspect)**:一个关注点的模块化,如事务管理或日志记录。...
Core模块提供了ApplicationContext接口,它是Spring应用程序的核心,负责管理bean的生命周期和配置。Beans模块则实现了bean的定义、实例化、装配和管理。 2. **Data Access/Integration**:这个模块支持数据访问,...
10. **spring-security-config-3.1.2.RELEASE.jar**:提供了基于XML或Java的配置方式,用于定义安全规则和策略,如定义访问控制列表,自定义过滤器链等。 通过以上这些jar包,我们可以深入研究Spring Security Web...
Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...
6. **配置与实践**:在Spring应用中,可以使用XML配置或者基于注解的方式来定义切面,编写自定义的拦截器,并指定切入点表达式来确定何时应用这些拦截器。 7. **最佳实践**:使用AOP时,应遵循模块化原则,将横切...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在使用Spring AOP时,通常需要引入特定的jar包来支持其功能。...
Spring AOP主要通过两种方式实现:XML配置和注解。本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时...
总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们可以将如日志记录、事务处理等通用功能轻松地插入到业务逻辑中,...
7. **注解驱动的AOP**:从Spring 2.5开始,可以使用注解来声明切面和通知,无需XML配置。`@Aspect`、`@Pointcut`、`@Before`等注解使得AOP的使用更加直观和简洁。 8. **AOP应用场景**:Spring AOP广泛应用于事务...
此外,这个包可能还包括其他相关组件,如Spring Expression Language (SpEL) 和Spring Test,用于测试和配置Spring应用。 2. spring-5.3.6-docs.zip:这个文件提供了Spring Framework 5.3.6.RELEASE的官方文档。...