`

使用spring aop aspect为什么没有被调用

阅读更多

使用spring aop aspect为什么没有被调用?

我在Java web项目中使用到了spring 的aop,记录用户连续登录失败的次数,如果连续登录失败的次数达到3次,则在当前 时间段内禁止登录。

aop的配置如下:

<aop:config>

		<aop:pointcut id="userServicePointcut"
			expression="execution(* com.shop.jn.service.*.login(..)) and args(username,passwd)" />
		<aop:aspect id="myAspect" ref="loginTimesAop">

			<aop:around pointcut-ref="userServicePointcut" method="around"
				arg-names="username,passwd" />
		</aop:aspect>
</aop:config>

 上述代码是beans.xml文件中的部分代码。

我在类UserService 的public int login(String username, String passwd)方法上加上了切面,当执行该方法时,就应该执行切面上的方法,可实际上没有。

UserService代码如下:

package com.shop.jn.service;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.opensymphony.xwork2.ActionContext;
import com.shop.jn.dao.UserDao;
import com.shop.jn.entity.User;
import com.shop.jn.util.Utils;

public class UserService  {
	private Logger logger = Logger.getLogger(this.getClass());
	private UserDao userDao;

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	
	public int login(String username, String passwd) {
		logger.info("UserService:login");
		User user = null;
		if (StringUtils.isEmpty(username)) {
			return Utils.LOGIN_RESULT_USERNAME_NULL;
		} else if (StringUtils.isEmpty(passwd)) {
			return Utils.LOGIN_RESULT_PASSWORD_NULL;
		}
		user = this.userDao.getByName(username);
		if (user == null) {
			return Utils.LOGIN_RESULT_USER_NOT_EXIST;
		} else {
			if (!user.getPassword().equals(passwd)) {
				return Utils.LOGIN_RESULT_PASSWORD_INVALID;
			}
		}
		return Utils.LOGIN_RESULT_SUCCESS;
	}

	
	public int login(User user) {
		if (user == null) {
			return Utils.LOGIN_RESULT_USERNAME_NULL;
		} else {
			return login(user.getUsername(), user.getPassword());
		}
	}

}

 我们要注意:在类UserService中,public int login(User user) 方法调用了public int login(String username, String passwd)方法。

那么什么地方调用了UserService中的方法呢?

在登录的action UserLoginAction中,部分代码如下:

// result of login check
		Integer result_check = this.userService.login(user);

 

结果运行时,登录时,aop的代码没有被执行,到底是什么原因呢?

也就是说UserService.login(String username, String passwd)方法上的切面方法没有被执行。

耗了大半天,才恍然大悟,然来登录action调用的是UserService.login(User user),而不是UserService.login(String username, String passwd),也就是说action直接调用的不是有两个参数的方法。

举例如下:

A类中调用B类中的方法b1,而b1又调用了B类中的b2方法(B类中有b1,b2两个方法),那么在b2方法上加切面是没有用的,因为A类中直接调用的是b1,而不是b2。

大家在开发过程中一定要注意这点,不清楚的可以看看java 的动态代理机制。

 

 

分享到:
评论

相关推荐

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring AOP完整例子

    在Spring XML配置中,我们可以使用`&lt;aop:config&gt;`元素来定义切点表达式,然后使用`&lt;aop:aspect&gt;`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...

    Spring Aop使用实例

    **Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    Spring AOP面向方面编程原理:AOP概念

    4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...

    Spring AOP实现机制

    - 如果目标对象没有实现任何接口,Spring会使用CGLIB库创建一个目标对象的子类,并在子类中插入通知代码。 - CGLIB是通过字节码生成技术动态创建子类,因此无需目标对象实现接口。 ### 3. 自定义类加载器 在某些...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中动态生成类和对象。 在Spring AOP中,我们通常使用@Aspect注解...

    spring aop spring aop

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,用于实现横切关注点的模块化。它允许开发者定义“切面”,将那些与业务逻辑无关,却为多个对象共有的行为(如日志、...

    Spring基础:Spring AOP简单使用

    Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它扩展了传统的面向对象编程(OOP),使得开发者能够更好地处理系统中的横切关注点,如日志、事务管理、权限控制等。...

    spring-aop实例

    在Spring AOP中,关注点被模块化为独立的“切面”,这些切面可以在多个对象上进行编织,而无需显式地修改这些对象。下面我们将深入探讨Spring AOP的关键概念和使用方法。 1. **切面(Aspect)**:切面是关注点的...

    springAop的配置实现

    - 如果目标类没有实现接口,Spring AOP会使用CGLIB代理。CGLIB是一个强大的高性能的代码生成库,它会在运行期动态生成子类并覆盖父类的方法来实现AOP的功能。 **4. 配置Spring AOP** 在Spring XML配置文件中,我们...

    JavaEE Spring AOP使用

    JavaEE Spring AOP(面向切面编程)是企业级应用开发中的重要技术,它允许...无论是通过注解还是XML配置,掌握Spring AOP的使用都能显著提升我们的开发效率。在实践中,可以根据项目的具体需求选择最适合的实现方式。

    spring-aop-jar

    它被许多AOP框架使用,包括Spring,使得不同的AOP实现可以互相协作。它包含如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`等核心接口。 2. spring-aop-4.1.6.RELEASE.jar:这是...

    springAOP配置动态代理实现

    2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...

    spring AOP入门教程

    在编程领域,Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它为开发者提供了一种强大的方式来管理横切关注点,如日志、事务管理、安全性等。本教程将带你了解Spring ...

    spring之AOP(动态代理)

    在Spring Boot项目中,配置和使用AOP相对简单。首先,我们需要引入Spring AOP和AspectJ的依赖,这通常在pom.xml或build.gradle文件中完成。然后,我们可以定义一个切面(Aspect),它包含通知(Advice)——即在特定...

    springaop.zip

    在本示例中,"springaop.zip" 包含了一个使用XML配置的Spring AOP应用实例,可以直接运行,配合相关的博客文章学习效果更佳。 在Spring AOP中,我们首先需要了解几个核心概念: 1. **切面(Aspect)**:切面是关注...

Global site tag (gtag.js) - Google Analytics