面试官:Spring AOP、AspectJ、CGLIB 都是什么鬼?它们有什么关系?
阅读本文大概需要 4.5 分钟。
作者:dolphin叔叔 链接:https://www.jianshu.com/p/fe8d1e8bd63e
先说说AspectJ
1、AspectJ 安装
bin:存放了 aj、aj5、ajc、ajdoc、ajbrowser 等命令,其中 ajc 命令最常用,它的作用类似于 javac doc:存放了 AspectJ 的使用说明、参考手册、API 文档等文档 lib:该路径下的 4 个 JAR 文件是 AspectJ 的核心类库
2、AspectJ HelloWorld 实现
package com.ywsc.fenfenzhong.aspectj.learn;
public class SayHelloService {
public void say(){
System.out.print("Hello AspectJ");
}
}
package com.ywsc.fenfenzhong.aspectj.learn;
public aspect LogAspect{
pointcut logPointcut():execution(void SayHelloService.say());
after():logPointcut(){
System.out.println("记录日志 ...");
}
}
3、编译SayHelloService
执行命令 ajc -d . SayHelloService.java LogAspect.java 生成 SayHelloService.class 执行命令 java SayHelloService 输出 Hello AspectJ 记录日志
ajc
命令后的 SayHelloService.class 文件不是由原来的 SayHelloService.java 文件编译得到的,该 SayHelloService.class 里新增了打印日志的内容——这表明 AspectJ 在编译时“自动”编译得到了一个新类,这个新类增强了原有的 SayHelloService.java 类的功能,因此 AspectJ 通常被称为编译时增强的 AOP 框架。*再谈 Spring AOP
<aop:aspectj-autoproxy/>
package com.ywsc.fenfenzhong.aspectj.learn;
import org.springframework.stereotype.Component;
@Component
public class SayHelloService {
public void say(){
System.out.print("Hello AspectJ");
}
}
package com.ywsc.fenfenzhong.aspectj.learn;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
@After("execution(* com.ywsc.fenfenzhong.aspectj.learn.SayHelloService.*(..))")
public void log(){
System.out.println("记录日志 ...");
}
}
package com.ywsc.fenfenzhong.mongodb;
import com.ywsc.fenfenzhong.aspectj.learn.SayHelloService;
public class TestCase {
public static void main(String[] args) {
SayHelloService sayHelloService = ApplicationUtil.getContext().getBean(SayHelloService.class);
sayHelloService.say();
}
}
Hello AspectJ
记录日志...
总结
定义普通业务组件。 定义切入点,一个切入点可能横切多个业务组件。 定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。
最后说说CGLIB
<aop:aspectj-autoproxy proxy-target-class="true"/>
推荐阅读:
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
朕已阅