MyEclipse的Add xxxx Capabilities 功能初学时感觉十分便捷,帮助完成了许多功能,很方便的可以搭建SSH平台。
久而久之发现问题多多,最近启动Tomcat服务器后经常出现奇怪的异常,如下:
Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.
百度后发现是由于包冲突导致的,在lib目录下删除一下包就可解决问题:
org.springframework.asm-3.0.5.RELEASE.jar
cglib-2.2.jar
而且在MyEclipse此功能中,似乎无法某些包剔除,实在是令人懊恼,着实不人性化,还是自己导入需要的包来的实在。
百度之后,发现这两个包得用处如下:
http://nopainnogain.iteye.com/blog/761630
http://www.blogjava.net/ktoo/archive/2007/08/19/137970.html
(2)cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包
在百度知道又发现以下回复:
http://zhidao.baidu.com/question/138967980.html
cglib用来继承类或实现接口以产生对象。
源自cglib官网http://cglib.sourceforge.net/的summary。
hibernate用到了注解技术,它是从元数据如何在早期java版本中使用属性文件的原理逐渐发展为今日的注解。
处理注解的三种方式:生成器、字节码转换、运行时反射。
字节码转换:注解处理器对带有注解的类字节码文件进行解析,对其做一些适当的修改,再重新编译并生成新的对象,也能生成其他类型文件(如xml)。字节码转换器在编译期(离线状态)、装载期都能运行,还能在运行时动态转换,且在字节码文件或runtime这样的保持策略下也可运行。
利用cglib产生新对象会提高字节码转换的效率,二者有一定的依存关系
百度文库:
http://wenku.baidu.com/view/e19b344c2e3f5727a5e962a8.html
asm既可以分析已有的的class文件,也可以修改已有的类,增强其功能,亦可以直接生成class文件。
asm现在作为主流的aop工具。
百度百科中发现了较为标准的答案:
http://baike.baidu.com/view/1254036.htm
是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。
CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
看来似乎是核心包,而且被Spring和Hibernate都是用,做为动态代理控制要访问的目标的一种途径,cglib的底层通过字节码处理框架asm来转换为新的类,类似的应用还有Groovy。
这里还有一些Spring中asm的应用实例,看来有空可以研究下Spring源码:
PS:
此外,之前还以为导入不需要的包:
struts2-convention-plugin-2.2.1.jar
打开了根据约定配置Action,导致页面无法访问。
还是决定研究一下SSH中每个包的作用,以后手工导入。
PS2:
又发现一个包问题
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml];nested exception is java.lang.NoSuchMethodError:
解决方法为在lib目录下删除spring-beans-2.5.6.jar,spring-context-2.5.6.jar,spring-web-2.5.6.jar,spring-core-2.5.6.jar三个包方可解决。
再一次验证了,包还是自己一个个导入好。
2011-11-25 coolhwm