å ³äºå¨æ代çåéæ代ç
å½ä¸ä¸ªå¯¹è±¡ï¼å®¢æ·ç«¯ï¼ä¸è½æè ä¸æ³ç´æ¥å¼ç¨å¦ä¸ä¸ªå¯¹è±¡ï¼ç®æ 对象ï¼ï¼è¿æ¶å¯ä»¥åºç¨ä»£ç模å¼å¨è¿ä¸¤è ä¹é´æ建ä¸ä¸ªæ¡¥æ¢--代ç对象ã
æç §ä»£ç对象çå建æ¶æä¸åï¼å¯ä»¥å为两ç§ï¼
éæ代çï¼äºå å好代ç对象类ï¼å¨ç¨åºåå¸å就已ç»åå¨äºï¼
å¨æ代çï¼åºç¨ç¨åºåå¸åï¼éè¿å¨æå建代ç对象ã
éæ代çå ¶å®å°±æ¯ä¸ä¸ªå ¸åç代ç模å¼å®ç°ï¼å¨ä»£çç±»ä¸å è£ ä¸ä¸ªè¢«ä»£ç对象ï¼ç¶åå½±å被代ç对象çè¡ä¸ºï¼æ¯è¾ç®åï¼ä»£ç å°±ä¸æ¾äºã
å ¶ä¸å¨æ代çåå¯å为ï¼JDKå¨æ代çåCGLIB代çã
1.JDKå¨æ代ç
æ¤æ¶ä»£ç对象åç®æ 对象å®ç°äºç¸åçæ¥å£ï¼ç®æ 对象ä½ä¸ºä»£ç对象çä¸ä¸ªå±æ§ï¼å ·ä½æ¥å£å®ç°ä¸ï¼å¯ä»¥å¨è°ç¨ç®æ 对象ç¸åºæ¹æ³ååå ä¸å ¶ä»ä¸å¡å¤çé»è¾ã
代ç模å¼å¨å®é 使ç¨æ¶éè¦æå®å ·ä½çç®æ 对象ï¼å¦æ为æ¯ä¸ªç±»é½æ·»å ä¸ä¸ªä»£çç±»çè¯ï¼ä¼å¯¼è´ç±»å¾å¤ï¼åæ¶å¦æä¸ç¥éå ·ä½ç±»çè¯ï¼ææ ·å®ç°ä»£ç模å¼å¢ï¼è¿å°±å¼åºå¨æ代çã
JDKå¨æ代çåªè½é对å®ç°äºæ¥å£çç±»çæ代çã
2.CGLIB代ç
CGLIBï¼CODE GENERLIZE LIBRARYï¼ä»£çæ¯é对类å®ç°ä»£çï¼
主è¦æ¯å¯¹æå®çç±»çæä¸ä¸ªåç±»ï¼è¦çå ¶ä¸çæææ¹æ³ï¼æ以该类ææ¹æ³ä¸è½å£°æ称finalçã
JDKå¨æ代çåCGLIB代ççæçåºå«
JDKå¨æ代çåªè½å¯¹å®ç°äºæ¥å£çç±»çæ代çï¼èä¸è½é对类 ã
CGLIBæ¯é对类å®ç°ä»£çï¼ä¸»è¦æ¯å¯¹æå®çç±»çæä¸ä¸ªåç±»ï¼è¦çå
¶ä¸çæ¹æ³ ã
å 为æ¯ç»§æ¿ï¼æ以该类ææ¹æ³æ好ä¸è¦å£°ææfinal ï¼finalå¯ä»¥é»æ¢ç»§æ¿åå¤æã
PSï¼final æ修饰çæ°æ®å ·æâç»æâçç¹å¾ï¼è¡¨ç¤ºâæç»çâææï¼
final 修饰çç±»ä¸è½è¢«ç»§æ¿ã
final 修饰çæ¹æ³ä¸è½è¢«åç±»éåã
final 修饰çåéï¼æååéæå±é¨åéï¼å³æ为常éï¼åªè½èµå¼ä¸æ¬¡ã
final 修饰çæååéå¿ é¡»å¨å£°æçåæ¶èµå¼ï¼å¦æå¨å£°æçæ¶å没æèµå¼ï¼é£ä¹åªæ ä¸æ¬¡èµå¼çæºä¼ï¼èä¸åªè½å¨æé æ¹æ³ä¸æ¾å¼èµå¼ï¼ç¶åæè½ä½¿ç¨ã
final 修饰çå±é¨åéå¯ä»¥åªå£°æä¸èµå¼ï¼ç¶ååè¿è¡ä¸æ¬¡æ§çèµå¼ã
åè代ç
CGLIBï¼
12345678 public Object createProxyObject(Object obj) { this.targetObject = obj; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(obj.getClass()); enhancer.setCallback(this); Object proxyObj = enhancer.create(); return proxyObj;// è¿å代ç对象ï¼è¿åçå¯¹è±¡å ¶å®å°±æ¯ä¸ä¸ªå°è£ äºâå®ç°ç±»âç代çç±»ï¼æ¯å®ç°ç±»çå®ä¾ã }JDKï¼
12345 public Object newProxy(Object targetObject) {// å°ç®æ å¯¹è±¡ä¼ å ¥è¿è¡ä»£ç this.targetObject = targetObject; <br> //注æè¿ä¸ªæ¹æ³çåæ°ï¼åé¢æ¯ç±»å®ç°çæ¥å£ return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);// è¿å代ç对象 }å¨ä»£ç ä¸å¯ä»¥çå°ï¼å¨çæ代çç±»æ¶ï¼ä¼ éçæ¯å®ç°ç±»æå®ç°çæ¥å£ targetObject.getClass().getInterfaces()ï¼æ以JDKåªè½å¯¹äºæ¥å£è¿è¡å代çãå¦ææ¢æç±»çè¯ï¼åä¼æjava.lang.ClassCastExceptionå¼å¸¸ã
å¨Springçæºç ä¸ï¼å¯ä»¥çå°å¾å¤çæ代çç±»ç代ç ã
å¨æ代ççåºç¨
AOPï¼Aspect-OrientedProgrammingï¼é¢ååé¢ç¼ç¨ï¼ï¼AOPå æ¬åé¢ï¼aspectï¼ãéç¥ï¼adviceï¼ãè¿æ¥ç¹ï¼joinpointï¼ï¼å®ç°æ¹å¼å°±æ¯éè¿å¯¹ç®æ 对象ç代çå¨è¿æ¥ç¹ååå å ¥éç¥ï¼å®æç»ä¸çåé¢æä½ã
å®ç°AOPçææ¯ï¼ä¸»è¦å为两大类ï¼
ä¸æ¯éç¨å¨æ代çææ¯ï¼å©ç¨æªåæ¶æ¯çæ¹å¼ï¼å¯¹è¯¥æ¶æ¯è¿è¡è£ 饰ï¼ä»¥å代åæ对象è¡ä¸ºçæ§è¡ï¼
äºæ¯éç¨éæç»å ¥çæ¹å¼ï¼å¼å ¥ç¹å®çè¯æ³å建âæ¹é¢âï¼ä»è使å¾ç¼è¯å¨å¯ä»¥å¨ç¼è¯æé´ç»å ¥æå ³âæ¹é¢âç代ç ã
Springæä¾äºä¸¤ç§æ¹å¼æ¥çæ代ç对象: JDKProxyåCglibï¼å ·ä½ä½¿ç¨åªç§æ¹å¼çæç±AopProxyFactoryæ ¹æ®AdvisedSupport对象çé ç½®æ¥å³å®ã
é»è®¤ççç¥æ¯å¦æç®æ ç±»æ¯æ¥å£ï¼å使ç¨JDKå¨æ代çææ¯ï¼å¦æç®æ 对象没æå®ç°æ¥å£ï¼åé»è®¤ä¼éç¨CGLIB代çã
å¦æç®æ 对象å®ç°äºæ¥å£ï¼å¯ä»¥å¼ºå¶ä½¿ç¨CGLIBå®ç°ä»£çï¼æ·»å CGLIBåºï¼å¹¶å¨springé ç½®ä¸å å ¥<aop:aspectj-autoproxy proxy-target-class="true"/>ï¼ã
jdk动态代理举例如下:
CGLIB(Code GenerationLibrary)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成Hibernate生成持久化类的javassist.
CGLIB生成代理机制:其实生成了一个真实对象的子类.
结论:在Spring框架中,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.