1、切面类定义
package login.aop;
import org.aspectj.lang.JoinPoint;
public class AspectTest {
//该方法中可加参数也可不加,如果加了第一个时切入点
public void before(JoinPoint joinPoint){
//获得拦截的类
String className = joinPoint.getClass().getName();
//获得拦截的方法
String methodName = joinPoint.getSignature().getName();
//joinPoint.getSourceLocation().
System.out.println("before-----------"+className+" "+methodName);
}
public void after(){
System.out.println("after-----------");
}
}
2、配置bean.xml
<bean id="userAdvice" class="login.aop.AspectTest">
</bean>
<aop:config>
<aop:aspect id="userAspect" ref="userAdvice">
<aop:pointcut id="myMethod"
expression="execution(public * login.service.impl.*.*(..))" />
<aop:before method="before" pointcut-ref="myMethod"/>
<aop:after-returning method="after" pointcut-ref="myMethod"/>
</aop:aspect>
</aop:config>
expression是匹配的方法特征,aop:before/after-returning必须与定义的切面类中的方法名一致, 注意xml的命名空间引用
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>
3、测试类
package login.test;
import login.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyAsp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context = new ClassPathXmlApplicationContext("beans3.xml");
UserService service = (UserService) context.getBean("userService");
service.list();
service.login("ligson", "admin");
//service.login("ligson", null);
}
}
4、常用切入点表达式总结
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外,所有的部分都是可选的。 返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是 *,它代表了匹配任意的返回类型。 一个全称限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用 * 通配符作为所有或者部分命名模式。 参数模式稍微有点复杂:() 匹配了一个不接受任何参数的方法, 而 (..) 匹配了一个接受任意数量参数的方法(零或者更多)。 模式 (*) 匹配了一个接受一个任何类型的参数的方法。 模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型。
下面给出一些常见切入点表达式的例子。
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包或者子包里的任意方法的执行:
execution(* com.xyz.service..*.*(..))
在service包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service.*)
在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service..*)
实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) :
this(com.xyz.service.AccountService)
‘this’在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。
实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :
target(com.xyz.service.AccountService)
任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)
args(java.io.Serializable)
请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。
有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)
@target(org.springframework.transaction.annotation.Transactional)
任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)
@within(org.springframework.transaction.annotation.Transactional)
任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)
@annotation(org.springframework.transaction.annotation.Transactional)
任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行)
@args(com.xyz.security.Classified)
分享到:
相关推荐
总结一下,这个"spring切面小例子"展示了如何在Spring中使用注解实现AOP。通过定义切面、切点和通知,我们可以将非业务逻辑的关注点如日志记录与核心业务代码解耦,使得代码更清晰,维护性更强。这个例子对于理解和...
在Spring XML配置文件中,我们可以定义`<aop:config>`元素来启用AOP支持,并通过`<aop:aspect>`元素定义切面。下面是一个基本的例子: ```xml <aop:aspect id="loggingAspect" ref="loggingService"> (* ...
- **Spring AOP**:Spring AOP允许开发者将一些通用的业务逻辑(例如日志、事务管理等)从业务代码中抽离出来,形成一个独立的部分,即切面(Aspect)。这样做的好处是可以减少业务代码的耦合度,提高代码的可读性...
`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细探讨Spring 4中的AOP和`@Aspect`的使用。 首先,了解AOP的基本概念。AOP通过“切面”来封装横切关注点,切面是跨越多个对象的行为或责任的模块...
在Spring Boot应用中,面向切面编程(AOP)是一种强大的设计模式,它允许我们以声明式的方式插入代码,比如日志记录、事务管理或权限检查。Aspect是AOP的核心概念,它封装了关注点,使得我们可以将这些关注点与业务...
Spring框架的AOP(面向切面编程)是其核心特性之一,它允许开发者在不修改原有代码的情况下,通过切面来插入额外的功能,比如日志记录、事务管理、性能监控等。在Spring AOP中,主要涉及到两个重要的库:...
Spring AOP支持AspectJ,可以通过引入AspectJ的库和配置,将AspectJ切面集成到Spring应用中。AspectJ提供了更丰富的语法,如`@Before`、`@After`、`@Around`等,使得切面的定义更加直观。 3. **注解驱动的切面** ...
### Spring AOP 配置切面实例解析 #### 一、引言 本文将通过一个具体的例子来介绍如何在Spring框架中使用面向切面编程(Aspect Oriented Programming, AOP)。我们将关注如何定义一个切面(Aspect),以及如何在...
描述:本文档将深入探讨如何在Spring框架中实现自定义切面(Aspect),并提供具体的代码示例。通过利用Spring的AOP(面向切面编程)特性,特别是@AspectJ注解的支持,我们可以创建灵活、可重用的业务逻辑切面,从而...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的核心概念包括切面、连接点、通知、切入点表达式等,...
在Spring AOP(面向切...接下来,我们需要配置Spring以启用AOP并识别我们的切面。在Spring XML配置文件中,我们可以添加以下内容: ```xml <aop:aspect ref="loggingAspect"> <!-- 配置通知 --> </aop:aspect> ...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...
Spring切面编程是Spring框架中的一个重要特性,它实现了面向切面的编程(AOP),这是一种设计模式,旨在提高代码的可重用性、模块化和可维护性。在AOP中,切面是关注点的一个模块化,这些关注点通常包括日志、事务...
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
在本篇中,我们将主要探讨如何使用`@Aspect`注解在Spring Boot中创建切面。 首先,让我们理解什么是切面。在AOP中,切面是关注点的模块化,这些关注点是跨越多个对象的,例如,事务管理就是一种关注点,它涉及到多...
面向切面编程(AOP,Aspect Oriented Programming)是Spring框架中的一个重要特性,它提供了一种模块化和声明式的方式来处理程序中的横切关注点,如日志、事务管理、安全控制等。AOP的核心概念包括切面、通知、连接...
3. **配置XML**: 在Spring的配置文件(如`applicationContext.xml`)中,你需要启用AOP代理并声明切面。首先,启用AOP上下文: ```xml ``` 然后,声明切面,指定其类和通知: ```xml <aop:aspect ref=...
4. **应用切面**:使用`@Aspect`注解标记切面类,并使用`@DeclareParents`注解将切面应用到目标对象上。 5. **测试**:编写测试用例,验证四种类型的Advice是否按照预期工作。 在`aopframe-1.0`这个压缩包中,可能...
本项目"**aop 多切面配置demo**"是一个基于Maven构建的示例工程,主要展示了如何在Spring框架中配置和使用多个切面。下面我们将深入探讨相关知识点: 1. **Spring AOP基本概念** - **切面(Aspect)**:切面是关注...
1. 定义切面:在Spring的XML配置文件中,使用`<aop:aspect>`标签定义一个切面,设置`id`属性为切面的唯一标识,`ref`属性引用切面类的bean。 ```xml <aop:aspect id="loggingAspect" ref="loggingAspectBean"/> ...