IT民工窝棚qbq.blog.chinaunix.net
qbq
全部博文(708)
国产(1)
欧美(1)
SEO(1)
CSS3(5)
TestNG(4)
HTML5(2)
iBatis(3)
URLRewrite(1)
WebService(1)
WebServer(12)
PHP(8)
OGNL(1)
AS2(2)
Multimedia(0)
Flex AS3(29)
面试(9)
Commet(1)
Ivy(2)
Bat(8)
Maven(18)
CSS(7)
Ext(9)
Spring问题集(4)
Word(1)
JFreeChart(2)
Groovy on Grails(14)
Python(1)
Portlet(3)
amCharts(4)
CSharp.NET(3)
Tools(1)
S2Dao(8)
HSQL(9)
taglib(28)
Source Safe(3)
JSTL(6)
EL(2)
Seasar-SAStruts(3)
Prototype(0)
JQuery(3)
DWR(7)
AJAX(14)
Guice(13)
Digit(2)
Notebook(4)
Log4J(8)
Servlet(2)
JSP(4)
Eclipse(12)
VB.NET(3)
DotNet(3)
JavaScript(63)
Thinking In Soft(10)
Framework(11)
English(0)
Struts2(14)
Struts(38)
Hibernate(10)
Spring(30)
HTML(14)
Web(5)
MYSQL(9)
SQLSERVER(1)
ORACLE(2)
SQL(3)
数据库(0)
DATABASE(0)
Windows(8)
JAVA(67)
Software(1)
Hardware(3)
OpenSource(2)
Microsoft(0)
Excel(4)
DIY(5)
Linux(4)
分类: Java
2009-08-12 14:10:40
碰到这样的错误提示信息一般是spring中AOP代理配置出现问题,在spring中代理的配置基本上有这么两种一种是基于JDK,而另外一种是CGLIB的代理。 基于JDK的代理是面向接口的,所有使用 Proxy 的对象都必须定义一个接口,而且用这些对象的代码也必须是对接口编程的,Proxy 生成的对象是接口一致的而不是对象一致的。Proxy 毕竟是通过反射实现的,必须在效率上付出代价:有实验数据表明,调用反射比一般的函数开销至少要大 10 倍。而且,从程序实现上可以看出,对 proxy class 的所有方法调用都要通过使用反射的 invoke 方法。因此,对于性能关键的应用,使用 proxy class 是需要精心考虑的,以避免反射成为整个应用的瓶颈。 CGLib代理同jdk代理采用不同的方式,它是采用修改java类文件而得到的。利用了CGLIB调用ASM库,ASM 能够通过改造既有类,直接生成需要的代码。增强的代码是硬编码在新生成的类文件内部的,没有反射带来性能上的付出。 新建一个公共类: public class UserManager extends HibernateDaoSupport { private Hashtable<NetUserinfo, Long> userDao = new Hashtable<NetUserinfo, Long>(); private Hashtable<NetRoleinfo, Long> roleDao = new Hashtable<NetRoleinfo, Long>(); public UserManager() { } public void saveUser() { HibernateTemplate ht = this.getHibernateTemplate(); List<NetUserinfo> lst = this.getHibernateTemplate().find( "from NetUserinfo"); for (NetUserinfo userinfo : lst) { System.out.println(userinfo.getUserName()); } } } 第一种采用JDK代理: applicationContext.xml <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <bean id="userManager" class="sx.cj.security.service.UserManager" scope="prototype"> <property name="sessionFactory" ref="sessionFactory" /> </bean> 测试: ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[] { "applicationContext-common.xml", "applicationContext-beans.xml" }); IUserManager userManager = (IUserManager) appContext .getBean("userManager"); userManager.saveUser(); 在测试文件中必须采用接口的方式,才能获得BEAN对象。
我在学习spring的aop中遇到同样的异常:
public static void main(String[] args) { ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:app.xml"); PointService pointService = (PointService) applicationContext.getBean("pointService");//这个PointService必须是接口 pointService.exe(); }
public static void main(String[] args) {
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:app.xml"); PointService pointService = (PointService) applicationContext.getBean("pointService");//这个PointService必须是接口 pointService.exe(); }
第二种:采用CGLIB代理 applicationContext.xml <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"></ref> </property> <property name="target"> <bean class="sx.cj.security.service.UserManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> <property name="proxyTargetClass"> <value>true</value> </property> </bean> 测试文件 ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[] { "applicationContext-common.xml", "applicationContext-beans.xml" }); UserManager userManager = (UserManager) appContext .getBean("userManager"); userManager.saveUser(); 你可以只用对象而不需要使用接口。
上一篇:Spring问题集1:Unable to validate using XSD
下一篇:Eclipse开发JS插件spket
登录 注册