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()方法的返回值改为用接口类型接收。