欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring-aop-aspectj-case 博客分类: spring springaopaspectj 

程序员文章站 2024-02-14 09:46:40
...
AOP概念:面向切面编程。

spring 集成AOP:
1、spring 有自己的aop实现ProxyFactory ,和 ProxyFactoryBean 。
2、spring 集成AspectJ实现的Aop。

spring AOP的使用场景:
在spring中 事务处理和rpc调用都大量的使用了aop,在低入侵监控方面都有大量应用。

spring以来的底层技术:Jdk代理和Cglib代理技术。

spring 支持的aop应用实现方式有以下几种:
1、基于ProxyFactory 的编程方式的aop实现。
2、基于ProxyFactoryBean 配置的,走spring ioc 路的实现方式。
3、基于以上方式自动创建代理 BeanNameAutoProxyCreator +Advice 和 DefaultAdvisorAutoProxyCreator + Advisor方式。
4、基于AspectJProxyFactory + AspectJ注解的编程的方式。
5、基于AspectJ 注解 + AnnotationAwareAspectJAutoProxyCreator的方式。
6、基于Schema + Aspectj注解语言的 Aop:config方式。


下面举例 基于AspectJ 注解的方式,实现一个方法耗时统计的功能:

/**
 * aspectj 基于注解的方式
 * @author wangxinchun
 */
public @interface MethodExecuteTimes {}



定义需要代理的业务方法
@Service
public class LoginService implements ILoginService {

	@MethodExecuteTimes
	public void regist(String username, String password, String email, int age) {
		   System.out.println(Arrays.toString(new Object[]{username,password,age}));
	}

}


定义切面
package org.job.user.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 定义切面 (关注方法上有注解:org.job.user.MethodExecuteTimes)
 * @author wangxinchun
 */
@Aspect
@Component
public class RegisterMonitorAspectj {
	public static final ThreadLocal<Long> time = new ThreadLocal<Long>();
	/** 方法调用前执行*/
	@Before("@annotation(org.job.user.MethodExecuteTimes))")
	public void before() {
		time.set(System.currentTimeMillis());
		System.out.println("invoke before ");
	}
	/** 方法调用后执行(如果方法抛出异常,此方法不会执行)*/
	@AfterReturning("@annotation(org.job.user.MethodExecuteTimes))")
	public void after() {
		System.out.println("invoke after ");
		System.out.println("times : "+(System.currentTimeMillis() - time.get()));
	}
	/** 方法调用finally 执行*/
	@After("@annotation(org.job.user.MethodExecuteTimes))")
	public void _final(){
		System.out.println("final");
	}
}


applicationContext.xml 配置启动AspectJ
<!-- <aop:aspectj-autoproxy/> -->
	<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>


测试用例
@Test
	public void testRegister() {
		LoginService loginService = new LoginService();
		AspectJProxyFactory factory = new AspectJProxyFactory();
		factory.setTarget(loginService);
		factory.addAspect(RegisterMonitorAspectj.class);
		
		
		ILoginService proxy = factory.getProxy();
		proxy.regist("admin", "123456","xinchun.wang@qunar.com",10);
	}


具体实现看附件~