`
am_human
  • 浏览: 24550 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring AOP笔记

 
阅读更多
首先,web.xml配置一个listener
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>


其实,使用默认的springListener配置文件路径:WEB-INF/applicationContext.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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	<aop:aspectj-autoproxy/>
	<bean id="logAspect" class="com.amhuman.comm.LogAspect"></bean>
	<bean id="userService" class="com.amhuman.service.UserServiceImpl" />
	<bean class="com.amhuman.comm.SpringHelper"></bean>
</beans>


接下来就是编写切面了(这里还用到了自定义的注解,下面会补上代码)
package com.amhuman.comm;

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class LogAspect {
	
	@After("execution(public * *(..))")
	public void afterSayHello(){
		System.out.println("After : ");
	}
	
	@Before("execution(public * *(..))")
	public void beforeSayHello(){
		System.out.println("Before : ");
	}
	
	@Around("execution(public * *(..)) && @annotation(com.amhuman.comm.Log)")
	public Object doLog(ProceedingJoinPoint pjp) throws Throwable{
		String param = ""; 
		Log logAnno = getAnno(pjp);
		if(logAnno.id() != -1){
			Object obj = pjp.getArgs()[logAnno.id()];
			if(logAnno.fieldName() == ""){
				param = obj.toString();
			}else{
				String fieldName = logAnno.fieldName();
				Method getMethod = obj.getClass().getMethod("getUserName", null);
				System.out.println(obj.getClass().toString());
				System.out.println(getMethod.toString());
				Object objddd = getMethod.invoke(obj, null);
				System.out.println(objddd);
//				param = getMethod.invoke(obj, null).toString();
			}
		}
		System.out.println("#before asp : "+ param);
		Object ret = pjp.proceed();
		System.out.println("#aftor asp");
		return ret;
	}
	
	private Log getAnno(ProceedingJoinPoint pjp) throws SecurityException, NoSuchMethodException{
		Class<?> currClass = pjp.getTarget().getClass();
		Method method = ((MethodSignature) pjp.getSignature()).getMethod();
		String shortMethodName = method.getName();
		Method realMethod = currClass.getMethod(shortMethodName, method.getParameterTypes());
		Log logAnnotation = realMethod.getAnnotation(Log.class);
		return logAnnotation;
	} 
}


注解的代码:
package com.amhuman.comm;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)  
@Target({ ElementType.METHOD })
public @interface Log {
	public int id() default -1;
	public String fieldName() default "";
}


写个单元测试跑下:
package com.amhuman.test;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.amhuman.entity.User;
import com.amhuman.service.IUserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-test.xml" })
public class SpringTest {
	
	@Resource
	IUserService userService;
	
	public IUserService getUserService() {
		return userService;
	}

	public void setUserService(IUserService userService) {
		this.userService = userService;
	}

	@Test
	public void testUser(){
		System.out.println(userService.getDefaultUser().getUserName());
		System.out.println("================================");
		System.out.println(userService.findById(100).getUserName());
		System.out.println("================================");
		System.out.println(userService.find(new User()).getUserName());
	}
	
}


对应的service代码
package com.amhuman.service;

import org.springframework.util.StringUtils;

import com.amhuman.comm.Log;
import com.amhuman.entity.User;

public class UserServiceImpl implements IUserService {
	private String userName;
	
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	/* (non-Javadoc)
	 * @see com.amhuman.service.IUserService#getDefaultUser()
	 */
	@Override
	public User getDefaultUser(){
		System.out.println("###");
		User user = new User();
		user.setUserId(1001);
		if(StringUtils.hasLength(this.userName)){
			user.setUserName(this.userName);
		}else{
			user.setUserName("WUYC-TEST");	
		}
		return user;
	}

	@Override
	@Log(id = 0,fieldName="userId")
	public User find(User user) {
		if(user == null){
			return getDefaultUser();
		}
		user.setUserName("WUTIANYU");
		return user;
	}

	@Override
	@Log(id = 0)
	public User findById(Integer id) {
		if(id == null){
			return getDefaultUser();
		}
		User user = new User();
		user.setUserId(id);
		user.setUserName("UserName["+id+"]");
		return user;
	}
}



搞定!
分享到:
评论

相关推荐

    李君老师JavaEE笔记-SpringAop

    ### 李君老师JavaEE笔记-SpringAop详解 #### 概述 李君老师的JavaEE笔记中的SpringAop部分,深入浅出地讲解了面向切面编程(Aspect Oriented Programming,简称AOP)的核心概念及其在Spring框架中的应用。AOP是一种...

    spring aop 学习笔记

    本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...

    Spring AOP IOC源码笔记.pdf

    本笔记将深入探讨这两个概念以及它们在Spring中的实现。 1. Spring框架简介: Spring作为一个轻量级的开源框架,旨在简化企业级应用的开发。它通过提供IOC容器,实现了对象的创建、管理和依赖注入,减轻了开发者对...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

    ssh-aop笔记

    SSH-AOP笔记主要涵盖的是Spring、Struts和Hibernate三大框架集成使用时,如何结合Aspect Oriented Programming(面向切面编程)的理念进行应用增强。在Java企业级开发中,SSH是常用的MVC架构,而AOP则是一种编程范式...

    spring源码--AOP流程--笔记.docx

    Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...

    Spring AOP学习笔记

    NULL 博文链接:https://linres.iteye.com/blog/281221

    springAOP笔记

    springAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOP

    Spring Aop 学习笔记

    Spring Aop 学习笔记

    Spring AOP源码笔记

    【Spring AOP源码笔记】 Spring AOP是Spring框架的核心组件之一,它实现了面向切面编程(Aspect-Oriented Programming,简称AOP),允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理等。...

    Spring_AOP笔记Spring_AOP笔记

    Spring_AOP,全称为Spring的面向切面编程,是一种编程范式,旨在将关注点分离,使得代码结构更清晰,可维护性更强。在传统的面向对象编程(OOP)中,我们通常会将业务逻辑与系统服务(如日志、事务管理等)混杂在...

    Spring AOP 使用笔记

    本笔记主要探讨了如何在Spring应用中使用AOP来实现横切关注点,如日志、事务管理、性能监控等。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切面由两个主要...

    Spring AOP 复习笔记.rar

    **Spring AOP 知识点详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许程序员定义“切面”,这些切面可以封装跨越多个对象的行为,比如日志、事务管理等。AOP...

    Spring AOP 用法笔记

    **Spring AOP 详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种将业务逻辑与系统服务(如日志、事务管理等)分离的方法,使得我们可以更好地关注...

    spring ioc aop mvc boot-学习笔记.docx

    Spring框架是Java开发中不可或缺的一部分,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,以及用于构建Web应用程序的MVC框架。Spring Boot则是基于Spring框架构建的应用程序启动器,旨在简化...

    SpringAOP案例代码笔记

    Spring的AOP开发(XML)Spring的AOP的注解开发 代码案例

    JAVA Spring AOP面向切面编程笔记

    JAVA Spring AOP面向切面编程笔记

    Spring学习笔记+学习源码.zip

    Spring框架是Java开发中的核心组件,它为应用程序提供了一个全面的基础设施,包括依赖注入(DI)、面向切面编程(AOP)以及数据访问等服务。SSM是Spring、SpringMVC和MyBatis的组合,是Java Web开发的常用框架栈。这...

    拿捏面试官-Spring AOP IOC源码笔记

    Spring的核心特性是控制反转(IOC)和面向切面编程(AOP)。它提供了一个全面的编程和配置模型,可以用于构建各种类型的Java应用程序,包括Web应用。 1. **Spring介绍** - **侵入式概念**:传统Java EE应用中,...

    Spring学习笔记(精华全记录)

    ### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...

Global site tag (gtag.js) - Google Analytics