Spring2.5中使用方法注入(method inject)之基本方法替代(basis method replacement)

环境:

   IDENetBeans6.5

   默认的Spring框架版本:Spring2.5

   

java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V错误的解决方法。

 

       最近在学习Spring框架,其方法注入模型中,可实现类似Ruby语言在运行时给一个类动态加入方法的功能,在Spring中称之为Method Replacement。于是写了如下的测试类,想看看实际的运行效果。这个类模拟一个魔术师大变活人的把戏(实例来自《Spring in Action),首先定义一个Performer接口(Spring中提倡使用接口来隐藏实现,从而实现应用组件的弱耦合)。

 

//*****************************

//****Interface Performe.java******

//*****************************

public interface Performer {
    public void perform();

}

 

然后是魔术师

//*************************

//*******Magician.java*******

//*************************

public class Magician implements Performer{
    private MagicBox magicBox;
    private String magicWords;

    public Magician() {}

    public void perform() {
        System.out.println(magicWords);
        System.out.println("The magic box contains...");
        System.out.println(magicBox.getContents());
    }

    /**
     * @param magicBox the magicBox to set
     */
    public void setMagicBox(MagicBox magicBox) {
        this.magicBox = magicBox;
    }

    /**
     * @param magicWords the magicWords to set
     */
    public void setMagicWords(String magicWords) {
        this.magicWords = magicWords;
    }

  接着,给魔术师道具(一个盒子),要不然他的把戏就没法变了。他要把美丽的助手装进入。

//**************************************

//*************Interface MagicBox.java******

//**************************************

public interface MagicBox {
    public String getContents();
}

 

 

//**************************************

//*************MagicBoxImpl.java**********

//**************************************

public class MagicBoximpl implements MagicBox{
    public MagicBoximpl() {}

    public String getContents() {
        return "A beautiful assistant";

}

 

     现在,还缺少一个道具,那就是魔术师最后要变出来的东东,这是一头老虎,呵呵。我们要用到Spring框架的方法替代(Method replacement支持来实现表演这个魔术。

     那么需要实现Spring框架中org.springframework.beans.factory.support.MethodReplacer接口。

 //**************************************

//*************TigerReplacmer.java*********

//**************************************

import java.lang.reflect.Method;
import org.springframework.beans.factory.support.MethodReplacer;

/**
 *
 * @author 

 */
public class TigerReplacer implements MethodReplacer{

    public Object reimplement(Object obj, Method method, Object[] args)
            throws Throwable {
        return "A ferocious tiger";
    }

}

    上面的MethodReplacer接口只有一个方法需要实现,这个方法将是需要替换的目标类中方法的实现,这个例子里是getContents()方法。

    好了,万事俱备,最后,在Spring配置文件中,配置他们的依赖关系(只摘录了需要的部分)

 

//**************************************

//*************applicationContext.xml*******

//**************************************

<bean id="magicBoxReplacer" class="com.springaction.springidol.MagicBoximpl">
        <replaced-method name="getContents" replacer="tigerReplacer"/>
</bean>
   

<bean id="tigerReplacer" class="com.springaction.springidol.TigerReplacer"/>
    
<bean id="harry" class="com.springaction.springidol.Magician">
        <property name="magicBox" ref="magicBoxReplacer" />
        <property name="magicWords" value="Bippity boppity boo" />
</bean>
   

<bean id="magicBox" class="com.springaction.springidol.MagicBoximpl" />
   

<bean id="magician" class="com.springaction.springidol.Magician">
        <property name="magicBox" ref="magicBox"/>   //
此处,使用magicBoxReplacer替代,进行魔术表演,变出一只老虎
        <property name="magicWords" value="Bippity boppity boo"/>
</bean>


}

 

     好了,运行,(o)哦,遇到:java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V错误,堆栈跟踪信息如下:


Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'magicBoxReplacer' defined in class path resource [com/springaction/springidol/applicationContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:917)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:873)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:514)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:485)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:413)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:735)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:122)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:66)
        at com.springaction.springidol.HelloApp.main(HelloApp.java:18)
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
        at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
        at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
        at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
        at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
        at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
        at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
        at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy$CglibSubclassCreator.instantiate(CglibSubclassingInstantiationStrategy.java:107)
        at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection(CglibSubclassingInstantiationStrategy.java:70)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:911)
        ... 15 more


     Googling一下,发现有很多人说是因为cglib2.2.jar包冲突导致的,解决方法是用cglib-nodep-2.2.jar替代。于是查找netbeans6.5的扩展库目录,发现Spring框架中使用的是cglib.jar。看来原因果然如此啊。接着从Spring中将cglib2.2.jar移除。

     于是继续googling,找到了cglib-nodep-2.2.jar包,并将它加入library中。

      运行。。。哦,OK。问题解决。

    然而,有一点让我搞不懂的是,googling得到的结果中,多是说SSH应用中才会出现这种包冲突问题。可是我的应用中仅仅加入了Spring Framework支持。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值