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 注解的方式,实现一个方法耗时统计的功能:
定义需要代理的业务方法
定义切面
applicationContext.xml 配置启动AspectJ
测试用例
具体实现看附件~
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); }
具体实现看附件~
推荐阅读
-
spring-aop-aspectj-case 博客分类: spring springaopaspectj
-
spring的数据库读写分离 博客分类: WEB框架 读写分离spring
-
spring读写分离 博客分类: spring spring读写分离
-
SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)(转载) 博客分类: Spring框架 aopspringaspectj
-
spring集成aspectj 博客分类: 框架 springaopaspectj
-
Spring实现AOP的4种方式 博客分类: spring spring代理的AOP@AspectJ注解POJOAspectJ
-
Spring AOP 博客分类: Java基础 SpringAOPaspectj
-
基于spring的aop实现多数据源动态切换 博客分类: javaspring 动态切换springaopAbstractRoutingDataSource
-
Spring Aspect 博客分类: spring boot aop
-
Spring AOP 完成日志记录 博客分类: Spring AOP