本文纯属自用。。。。。不适合所有人。。。。
最近看到一道面试题,如果不使用spring,还有什么方式能够实现代理?答案是可以的,spring是运行时生成代理,还有另外一种方式就是编译时生成代理,将代码在编译时注入,这种注入是通过JAVA2EE提供的JSR的接口实现的。
基础概念
几个基本概念:
- 什么是字节码文件,什么是源文件
- 对应java语言而言,编译、运行是个怎样的过程
- 用java反射执行某个类的方法 和 通过对象.方法去执行一个方法有啥区别
- 什么是代理?代理的一些基本概念或者术语?
- 动态代理和静态代理的区别,这种代理是spring独有的嘛?
- 不依赖springIoc容器,可以实现代理吗?
- 代理为什么是非侵入式的?
字节码与源文件:
能直接被机器识别的是字节码文件,字节码文件就是.class文件;
源文件就是.java文件,我们编写代码就是在编写源文件
编译与运行:
编译就是将源文件转成字节码文件的过程
运行就是在jvm虚拟机上,把字节码文件解释执行的过程。只有程序真正在jvm上运行起来的时候,它才会获得内存
‘反射执行类的某个方法’与‘通过对象调用方法’有啥区别:
1>通过对象调用方法:现有.java文件 ->通过构造器获得对象->通过对象调用方法
2>通过反射调用方法:通过全限定名获取Class对象,Class.forName(“xxx”) ->通过Class对象获取一个实例对象obj;通过Class对象、传入指定方法名和方法参数类型来获取Method对象->通过Method.invoke(obj, “xxx”) 的方式执行方法
3>总结:正常的程序执行顺序是从源文件到字节码文件,而反射看起来……
代理:春运抢票,自己抢不到,让黄牛帮忙抢,黄牛就是代理。springaop里的相关术语:
目标对象:又叫被代理对象
切面:
切点、织入点:要切入的某个方法,指明是哪个包下的那个类里的某个方法
通知、advice:不要过分纠结“通知”这个字眼。通知类型可以分为:前置通知、后置通知、环绕通知、异常通知等???
非侵入式:你可以一路顺畅地写业务代码。非主线的逻辑就写在切面类里。清爽干净,井水不犯河水
aop是会依赖于springioc容器的,如果你怕对spring产生依赖,可以通过实现j2ee的JSR接口来达到类似的在编译时植入代码的目的。
写累了,未完待续……