`
netfork
  • 浏览: 490426 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

通过CGLIB进行构造函数注入时,AOP引发异常

阅读更多
(感觉这个问题虽然是个纯技术问题,但最好发到论坛里问问,因为俺在网上查了好半天也没查到解决方法。如果非要给俺整到“问答”里,俺也没脾气。)


现象描述
Struts2 + Spring,Action中注入Service,Service中注入Dao。
Service中并没有使用接口,根据网上资料,应是使用CGLIB来创建类对象。
此前,使用Set注入时,没有任何问题,一切正常。
前两天看了一下Spring in Action,对于Dao注入Service时,通过构造函数注入比较不错。
今晚改成通过构造函数注入时,发生了异常,由于对CGLIB的加载对象的过程不太了解,原因实现查不明白,各位请帮帮忙吧。

具体实现

Service类的实现
public class UserService {

	private IUserDao userDao;
	
	public UserService(IUserDao userDao) {
		this.userDao = userDao;
	}
}


applicationContext.xml的配置
	<!-- Spring的iBatis 配制 -->
	<bean id="sqlMapClient"
		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation"
			value="WEB-INF/SqlMapConfig.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- spring 的事务处理类配置 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>

	<!-- AOP设置 对service层进行事务控制 -->
	<aop:config proxy-target-class="true">
		<aop:pointcut id="serviceOperation"
			expression="execution(* cn.ipcat.service.*.*(..))" />
		<aop:advisor pointcut-ref="serviceOperation"
			advice-ref="txAdvice" />
	</aop:config>

	<!-- 事务设置 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 保存 -->
			<tx:method name="save*" rollback-for="Exception" />
			<!-- 新建 -->
			<tx:method name="insert*" rollback-for="Exception" />
			<tx:method name="create*" rollback-for="Exception" />
			<!-- 修改 -->
			<tx:method name="update*" rollback-for="Exception" />
			<!-- 删除 -->
			<tx:method name="delete*" rollback-for="Exception" />
			<!-- 其他 只读 -->
			<tx:method name="*" read-only="true"
				rollback-for="Exception" />
		</tx:attributes>
	</tx:advice>

	<!-- DAO  -->
	<bean id="userDao" class="cn.ipcat.entity.user.UserDao">
		<property name="sqlMapClient">
			<ref bean="sqlMapClient"></ref>
		</property>
	</bean>

	<!-- Service -->
	<bean id="userService" class="cn.ipcat.service.UserService">
		<constructor-arg>
			<ref bean="userDao" />
		</constructor-arg>
	</bean>


struts.xml的配置
略。

我个人的测试分析
我试验了一下,只要在applicationContext.xml中不加下段记述就没事,一旦加了,就出错。
考虑,可能是“aop:pointcut”的“expression”的问题,分析可能是通过带参数的构造函数生成对象时,进行切面控制,从而导致问题,但是为什么通过Set方式注入时就没事,没想明白。
如果真的是“expression”的问题,那么对于带参数的构造函数,这里应该怎么写呢?

	<!-- AOP设置 对service层进行事务控制 -->
	<aop:config proxy-target-class="true">
		<aop:pointcut id="serviceOperation"
			expression="execution(* cn.ipcat.service.*.*(..))" />
		<aop:advisor pointcut-ref="serviceOperation"
			advice-ref="txAdvice" />
	</aop:config>


具体的错误信息
在tomcat一启动时,预加载各个类对象时,就出错了。

信息: Initializing Spring root WebApplicationContext
[ERROR]_2008-11-30 22:27:27_org.springframework.web.context.ContextLoader@(ContextLoader.java:215):Context initialization failed
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in ServletContext resource [/WEB-INF/appcontext/UserAppContext.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class cn.ipcat.service.UserService]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class cn.ipcat.service.UserService]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
	at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:488)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:363)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:324)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1343)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
	... 29 more
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721)
	at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
	at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
	at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
	at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
	at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
	at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
	... 36 more
2008-11-30 22:27:27 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in ServletContext resource [/WEB-INF/appcontext/UserAppContext.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class cn.ipcat.service.UserService]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class cn.ipcat.service.UserService]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
	at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:488)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:363)
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:324)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1343)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
	... 29 more
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
	at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721)
	at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
	at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
	at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
	at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
	at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
	at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
	... 36 more
2008-11-30 22:27:27 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2008-11-30 22:27:27 org.apache.catalina.core.StandardContext start
严重: Context [] startup failed due to previous errors
2008-11-30 22:27:27 org.apache.catalina.core.ApplicationContext log
信息: Closing Spring root WebApplicationContext


我已经将结果分析出来。
如果你有相同的问题,请读下面的文章。
http://netfork.iteye.com/blog/286215
分享到:
评论
1 楼 netfork 2008-12-03  
我已经将结果分析出来。
如果你有相同的问题,请读下面的文章。
http://netfork.iteye.com/blog/286215
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    spring_aop_cglib的实现方式

    然而,它的缺点是生成的代理类会稍微增加内存占用,且由于是通过继承实现,如果目标类已经定义了很多final方法或者构造函数,可能无法进行代理。 总的来说,Spring AOP通过CGLIB提供了一种强大的动态代理机制,允许...

    cglib的依赖包

    - 如果目标类的构造函数有参数,使用CGlib时需要提供相应的参数。 总结来说,CGlib是一个强大且灵活的Java代码生成库,它简化了字节码操作,为开发人员提供了动态创建类和方法的能力,尤其在实现动态代理和AOP场景...

    spring源码编译时缺少的类cglib,objenesis,castor

    在Spring中,Objenesis用于在没有构造函数或者构造函数有特定需求的情况下快速创建对象,特别是在AOP代理中。Objenesis避免了调用默认构造函数的需求,使得即使在私有构造函数或者受保护构造函数的情况下也能创建...

    spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar

    在Spring中,Objenesis主要用于处理一些特殊情况,比如在CGLIB代理中,当目标类没有无参构造函数时,Objenesis可以帮助创建对象实例。 Objenesis的主要特点: 1. 快速:Objenesis设计为快速且高效,避免了传统构造...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    了解CGLIB和Objenesis的工作原理,可以帮助我们更好地理解Spring如何实现依赖注入、AOP以及其它高级特性。例如,CGLIB的代理过程涉及到了ASM库,Objenesis的实例化机制则涉及了Java的反射API和类加载器。通过深入...

    cglib__jar包.zip

    - 局限性:如果目标类声明为final,或者关键方法(如构造函数)为final,CGLIB将无法对其进行增强。另外,对于大型和复杂的类结构,CGLIB生成的字节码可能会导致类加载时间和内存占用增加。 6. **与其他技术的比较...

    Spring源码出错,缺失cglib.3.2.6 与 objenesis.2.6

    在Spring框架中,Objenesis用于AOP代理的创建,特别是在CGLIB中,当需要创建一个实例而没有合适的构造函数时,Objenesis可以帮助快速实例化对象。Objenesis通过一些优化的技术,可以避免调用默认构造器,从而提高...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    在Java开发领域,Spring框架是不可或缺的重要组成部分,它为开发者提供了强大的依赖注入、AOP(面向切面编程)以及各种企业级服务。标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是...

    J2EE_Spring之AOP与依赖注入例子

    在传统的Java代码中,对象常常通过构造函数、setter方法或全局变量来获取依赖。而依赖注入则是由外部容器(如Spring IoC容器)负责创建对象并管理它们之间的依赖关系,而不是由对象自身负责。这样,对象只需要声明其...

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    Objenesis可以快速地实例化一个对象,而无需调用构造函数,这对于Spring的依赖注入和AOP代理来说是一个非常有用的补充工具。 这两个库在Spring框架中的协同工作,使得Spring能够灵活地处理各种类型的类,并实现高效...

    spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar

    总的来说,`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`是Spring框架正常运行的关键组成部分,它们分别负责动态子类生成和无参构造函数对象的快速实例化,对于理解和优化Spring应用的性能有...

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    当Spring需要创建一个对象但又无法通过常规方式调用构造函数时,Objenesis可以派上用场。例如,在AOP(面向切面编程)中,Objenesis帮助Spring快速生成代理对象,无需知道实际目标类的构造函数详情。 2. **CGLIB...

    spring高版本源码分析缺lib spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    Objenesis通过一些内部优化和技巧,能够在不调用任何构造函数的情况下创建对象,这对于理解和调试Spring的依赖注入和对象生命周期管理机制具有重要意义。 在下载Spring源码后,如果没有这两个库,编译或运行时可能...

    com.springsource.net.sf.cglib-2.2.0架包

    此外,如果目标类的构造函数有特定的访问权限,也可能影响到CGLIB的使用。 9. **安全性与内存管理**:由于CGLIB创建的是类的子类,这可能导致类加载器泄露问题,尤其是在长时间运行的应用中。因此,正确管理和关闭...

    spring-cglib-repack-3.2.6 和 spring-objenesis-repack-2.6

    在Spring框架中,Objenesis主要用于测试场景,特别是与CGLIB结合使用时,它能帮助快速实例化CGLIB生成的代理类,而无需执行实际的构造函数逻辑。这对于测试和初始化过程非常有用,因为它可以避免复杂的构造过程。 ...

    spring ioc aop

    1. 构造函数注入:在对象创建时,通过构造函数传入依赖对象。 2. Setter方法注入:对象创建后,通过setter方法设置依赖对象。 3. 接口注入:通过实现特定接口,由容器调用接口方法注入依赖。 其次,Aspect-Oriented...

    Cglib动态代理需要用到的jar包

    然而,如果目标类没有可访问的无参构造函数或者实现过多接口,Cglib可能会遇到问题。 在实际开发中,Cglib常与Spring AOP结合使用,通过`@Transactional`注解实现事务管理。当一个方法被标记为`@Transactional`时,...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    在Spring框架中,Objenesis用于快速实例化无参构造函数的对象,特别是在CGLIB代理中。`spring-objenesis-repack-2.6.jar`是Objenesis库的一个重新打包版本,同样是为了与Spring框架更好地配合使用。 在IDEA中构建...

    spring-cglib-repack-3.2.5.jar spring-objenesis-repack-2.6.jar spring依赖包

    当Spring的AOP代理无法通过简单地继承来实现时(例如,目标类为final或包含final方法),CGlib就会介入,通过字节码技术生成目标类的一个子类,以此来实现对目标方法的拦截和增强。CGlib的核心是ASM库,ASM是一个...

    cglib动态代理

    此外,如果目标类的构造函数有特殊需求,如需要参数,使用CGLib时需额外处理。 总结起来,CGLib动态代理是Java开发中的一个重要工具,它通过字节码技术为不支持接口的类提供代理能力,广泛应用于AOP、测试等场景。...

Global site tag (gtag.js) - Google Analytics