天天看點

Spring AOP常見錯誤解析

spring 3.0以後的版本相比于2時代的版本一個重要的變化就是aop所依賴的jar包沒有一起釋出,需要自己單獨下載下傳。

spring aop部分使用jdk動态代理或者cglib來為目标對象建立代理。如果被代理的目标實作了至少一個接口,則會使用jdk動态代理,如果用jdk動态代理,就必須為被代理的目标實作一個接口(要注意的地方是:需要将ctx.getbean()方法的傳回值用接口類型接收);。所有該目标類型實作的接口都将被代理。若該目标對象沒有實作任何接口,則建立一個cglib代理,如果使用cglib強制代理,就必選事先将cglib包導入項目,設定beannameautoproxycreator的proxytargetclass屬性為true。

在編寫aop程式時,常見的錯誤有以下幾種:

1.如果提示如下錯誤:

exception in thread "main"

org.springframework.beans.factory.beandefinitionstoreexception: unexpected exception parsing xml document from class path resource[applicationcontext.xml]; nested exception is java.lang.noclassdeffounderror:org/aopalliance/aop/advice

   atorg.springframework.beans.factory.xml.xmlbeandefinitionreader.doloadbeandefinitions(xmlbeandefinitionreader.java:412)

   atorg.springframework.beans.factory.xml.xmlbeandefinitionreader.loadbeandefinitions(xmlbeandefinitionreader.java:334)

   atorg.springframework.beans.factory.xml.xmlbeandefinitionreader.loadbeandefinitions(xmlbeandefinitionreader.java:302)

   atorg.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:174)

   atorg.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:209)

   atorg.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:180)

   atorg.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:243)

   atorg.springframework.context.support.abstractxmlapplicationcontext.loadbeandefinitions(abstractxmlapplicationcontext.java:127)

   atorg.springframework.context.support.abstractxmlapplicationcontext.loadbeandefinitions(abstractxmlapplicationcontext.java:93)

   atorg.springframework.context.support.abstractrefreshableapplicationcontext.refreshbeanfactory(abstractrefreshableapplicationcontext.java:131)

   atorg.springframework.context.support.abstractapplicationcontext.obtainfreshbeanfactory(abstractapplicationcontext.java:522)

   atorg.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:436)

   atorg.springframework.context.support.classpathxmlapplicationcontext.<init>(classpathxmlapplicationcontext.java:139)

   atorg.springframework.context.support.classpathxmlapplicationcontext.<init>(classpathxmlapplicationcontext.java:83)

   atcom.aoptest.com.test.main(test.java:14)

caused by:java.lang.noclassdeffounderror: org/aopalliance/aop/advice

   atjava.lang.classloader.defineclass1(native method)

   atjava.lang.classloader.defineclass(classloader.java:800)

   atjava.security.secureclassloader.defineclass(secureclassloader.java:142)

   atjava.net.urlclassloader.defineclass(urlclassloader.java:449)

   atjava.net.urlclassloader.access$100(urlclassloader.java:71)

   atjava.net.urlclassloader$1.run(urlclassloader.java:361)

   atjava.net.urlclassloader$1.run(urlclassloader.java:355)

   atjava.security.accesscontroller.doprivileged(nativemethod)

   atjava.net.urlclassloader.findclass(urlclassloader.java:354)

   atjava.lang.classloader.loadclass(classloader.java:425)

   atsun.misc.launcher$appclassloader.loadclass(launcher.java:308)

   atjava.lang.classloader.loadclass(classloader.java:358)

   atorg.springframework.aop.config.configbeandefinitionparser.getadviceclass(configbeandefinitionparser.java:410)

   atorg.springframework.aop.config.configbeandefinitionparser.createadvicedefinition(configbeandefinitionparser.java:366)

   atorg.springframework.aop.config.configbeandefinitionparser.parseadvice(configbeandefinitionparser.java:332)

   atorg.springframework.aop.config.configbeandefinitionparser.parseaspect(configbeandefinitionparser.java:227)

   atorg.springframework.aop.config.configbeandefinitionparser.parse(configbeandefinitionparser.java:115)

   atorg.springframework.beans.factory.xml.namespacehandlersupport.parse(namespacehandlersupport.java:73)

   atorg.springframework.beans.factory.xml.beandefinitionparserdelegate.parsecustomelement(beandefinitionparserdelegate.java:1419)

   atorg.springframework.beans.factory.xml.beandefinitionparserdelegate.parsecustomelement(beandefinitionparserdelegate.java:1409)

   atorg.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.parsebeandefinitions(defaultbeandefinitiondocumentreader.java:184)

   atorg.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.doregisterbeandefinitions(defaultbeandefinitiondocumentreader.java:140)

   atorg.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.registerbeandefinitions(defaultbeandefinitiondocumentreader.java:111)

   atorg.springframework.beans.factory.xml.xmlbeandefinitionreader.registerbeandefinitions(xmlbeandefinitionreader.java:493)

   atorg.springframework.beans.factory.xml.xmlbeandefinitionreader.doloadbeandefinitions(xmlbeandefinitionreader.java:390)

   ...14 more

caused by:

java.lang.classnotfoundexception: org.aopalliance.aop.advice

   atjava.net.urlclassloader$1.run(urlclassloader.java:366)

   ...63 more

則說明缺少aop運作所依賴的jar包,需要下載下傳,jar包為

aopalliance-1.0.jar

cglib-nodep-2.2.jar

com.springsource.org.aspectj.tools-1.6.6.release.jar

com.springsource.org.aspectj.weaver-1.6.8.release.jar

commons-logging-1.1.3.jar

為了下載下傳方面,我把這幾個jar包共享出來,下載下傳位址為:

2.提示以下錯誤:

pre-instantiating singletons inorg.springframework.beans.factory.support.defaultlistablebeanfactory@72f08d6f:defining beans [persondaoimpl,transaction,org.springframework.aop.config.internalautoproxycreator,org.springframework.aop.aspectj.aspectjpointcutadvisor#0];root

of factory hierarchy

java.lang.classcastexception:com.sun.proxy.$proxy0 cannot be cast to com.aoptest.com.persondaoimpl

   atcom.aoptest.com.test.main(test.java:15)

這是由于ctx.getbean()方法的傳回值用接口的實作類接收,需要将ctx.getbean()方法的傳回值改為用接口類型接收。