开始前我们要导入spring需要的jar包;
还需要引入 aspectjweaver.jar 和 cglib.jar 这两个jar包
如果是maven项目的话,在pom.xml 的dependencies节点下添加如下引用即可:
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
现在开始:
首先,我们定义一个工程中要用到的简单实体Bean-- User.java
package org.xmy.ldq.entity;
import java.io.Serializable;
/**
* 测试用实体
* @author LiDuanqiang
*/
public class User implements Serializable{
private static final long serialVersionUID = 5752197085695030514L;
private String id;
private String name;
private String password;
private String address;
public User() {}
public User(String id, String name,String password,String address) {
super();
this.id = id;
this.name = name;
this.password = password;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
接下来定义一个通知对象:UserAdvice.java
package org.xmy.ldq.aop;
import org.aspectj.lang.JoinPoint;
/**
* 用户操作的通知对象
* @author LiDuanqiang
*/
public class UserAdvice {
/**
* 主体方法返回后将执行的通知方法
* @param JoinPoint
* @param retValue主体方法传递到通知方法的返回值
* @return
*/
public Object afterReturning(JoinPoint joinPoint,Object retValue)throws Throwable{
Object object = null;
object = joinPoint.getThis();//返回代理对象
/*切入点主体方法的名字*/
String methodName = joinPoint.getSignature().getName();
if (retValue instanceof Boolean && (Boolean)retValue && methodName.equals("login")) {
System.out.println("方法:"+methodName+"()"+"成功执行;"+"登录成功!");
}
return object;
}
}
再定义一个目标类:AOPBean.java
package org.xmy.ldq;
import org.xmy.ldq.entity.User;
/**
* 主体Bean
* @author LiDuanqiang
*/
public class AOPBean{
public Boolean login(User user){
Boolean ret = false;
/*用户名和密码都为ldq则成功登录*/
if (user.getName().equals("ldq")&&user.getPassword().equals("ldq")) {
ret = true;
}
return ret;
}
}
最后定义一个测试主程序的实现类:App.java
package org.xmy.ldq;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.xmy.ldq.entity.User;
/**
* 测试
* @author LiDuanqiang
*/
public class App{
public static void main( String[] args ){
ClassPathXmlApplicationContext factory =
new ClassPathXmlApplicationContext("applicationContext.xml");
AOPBean aopBean = (AOPBean) factory.getBean("aopBean");
aopBean.login(new User("1","ldq","ldq","cs"));
System.exit(0);
}
}
配置文件很重要:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<aop:config>
<!-- 定义切点 -->
<aop:pointcut id="login_PointcutTarget" expression="execution(* org.xmy.ldq.AOPBean.login(..))"/>
<!-- 定义切面 -->
<aop:aspect id="userAspect" ref="userAdvice">
<aop:after-returning
pointcut-ref="login_PointcutTarget"
arg-names="joinPoint,retValue"
returning="retValue"
method="afterReturning"
/>
</aop:aspect>
</aop:config>
<bean id="userAdvice" class="org.xmy.ldq.aop.UserAdvice"></bean>
<bean id="aopBean" class="org.xmy.ldq.AOPBean"></bean>
</beans>
说明:arg-names="joinPoint,retValue" 被切目标方法的参数名称;
returning="retValue" 目标方法成功执行后的返回值 一般类型定义为 Object;
method="afterReturning"目标方法名称
如果程序中报出
java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
是aspectjweaver.jar包丢失了,将其引入即可;
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.错误 是因为采用的CGLIB代理,应把相应的jar包引入。
分享到:
相关推荐
在本示例中,我们将深入探讨如何利用Spring AOP实现简单的权限验证。 首先,AOP的核心概念是切面(Aspect),它封装了横切关注点,比如日志、事务管理、权限验证等。在Spring AOP中,切面通过通知(Advice)来定义...
此外,Spring AOP还支持其他类型的注解,如`@AfterReturning`(方法正常返回后执行)、`@AfterThrowing`(方法抛出异常后执行)和`@Around`(包裹整个方法调用,可以在方法调用前后自由控制逻辑)。通过灵活运用这些...
例如,我们可以使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等注解来声明前置、后置、环绕、返回后和异常后通知,这些通知在切点匹配时执行。 接下来,让我们讨论如何在Spring AOP中...
现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切面是包含通知(Advice)和切入点(Pointcut)的类。通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`...
此外,Spring AOP还支持其他类型的通知,如`@After`(方法执行后)、`@AfterReturning`(正常返回后)、`@AfterThrowing`(抛出异常后)和`@Around`(环绕通知,完全控制方法的调用过程)。每种通知类型都有其特定的...
通知(Advice)是在特定切点执行的代码,可以是前置通知(before advice)、后置通知(after advice)、返回通知(return advice)、异常通知(exception advice)和环绕通知(around advice)。最后,切入点表达式...
3. 通知:在特定连接点执行的代码,如前置通知(Before)、后置通知(After)、返回通知(After Returning)、异常通知(After Throwing)和环绕通知(Around)。 4. 引入:允许在运行时向目标对象添加新的方法或...
在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四种通知类型:Before、After、AfterThrowing和Around,以及它们在实际开发中的应用。 1. **Before通知**: 在方法执行前触发,可以用来执行...
Spring支持五种不同类型的通知:前置通知(before)、后置通知(after)、返回后通知(after returning)、异常后通知(after throwing)和环绕通知(around)。例如,我们可以创建一个切面类`LoggingAspect`: ```...
在本示例中,我们将深入探讨Spring框架2.5.6版本中的面向切面编程(AOP)概念。Spring AOP是Spring框架的核心组件之一,它允许开发者在不修改源代码的情况下,对程序进行横切关注点(如日志、事务管理、性能监控等)...
**Spring AOP示例** 以入门级的`advice`为例,我们可能有一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void ...
在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect public class LoggingAspect { // ... } ``` #### 2. 定义通知(Advice) 通知是在特定连接点...
Spring支持五种不同类型的通知:前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After Throwing)和环绕通知(Around)。 3. 连接点(Join Point):连接点是在应用程序执行...
`SpringAop.ppt`文件很可能包含了一个详细的讲解,涵盖了Spring AOP的基本概念、配置方式、使用注解声明切面、基于XML的配置以及如何自定义切面。PPT通常会通过图表、代码示例和流程图来帮助理解复杂的概念,使得...
接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...
3. **通知(Advice)**:在特定连接点执行的代码,即切面要实施的行为,包括前置通知、后置通知、返回通知、异常通知和环绕通知。 4. **切入点(Pointcut)**:匹配连接点的规范,定义了通知将在何时何地执行。 5....
Spring AOP,全称Aspect Oriented Programming(面向切面编程...这个小示例虽然简单,但足以让我们了解Spring AOP的基本工作原理和配置方式。通过深入研究和实践,我们可以进一步发掘其潜力,提升应用程序的架构质量。
在这个"SpringAOP的例子"中,我们将深入探讨如何在Eclipse环境下利用Spring AOP和动态代理来实现这些功能。 首先,让我们理解什么是AOP。AOP是一种编程范式,旨在减少代码的重复性和增强可维护性。在传统的OOP中,...
在本资源"spring aop简单示例.rar"中,我们可以预期包含以下关键知识点: 1. **切面(Aspect)**:切面是AOP的核心概念,它封装了横切关注点,包括通知(Advice)和切入点(Pointcut)。通知定义了在何时何地执行...
Spring AOP 简单入门示例 AOP(Aspect-Oriented Programming),即面向方面编程,是一种编程范式。AOP 是 OOP 的补充,它将系统中的横切性关注点模块化,并将其与业务逻辑分离。 在 Spring 中,AOP 是通过使用 ...