小弟现在学SPRING SETTER注入会了  现在搞构造注入可是XML老是有错误 其实很简单的一个例子而已
包括一个用户BEAN 和一个测试MAIN 下面就是代码了 请大家指教一下 其实就是简单的测试 连数据库都没连
这个是用户BEAN 
userbean.java
public class userbean { private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
}

}
接下来是测试类在这个类里使用了构造主入 现在不管他的实用性我只是在做测试
testbean.java
public class testbean {

userbean user;
public testbean(){
this.user = user;

}
public void fangfa(){
user.setUsername("asd");

System.out.println(user.getUsername());

}

public static void main(String[] args){

testbean t = new testbean();
t.fangfa();


}

}
下面是SPRING的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="user" class="com.spring.beans.userbean"></bean> <bean id="testbean" class="com.spring.beans.testbean">
(就是这里老提示错误)-------------》 <constructor-arg ref="user"></constructor-arg>
</bean>
</beans>
麻烦大家帮助一起解决 谢谢呵呵在线等 一OK马上给分

解决方案 »

  1.   

    constructor-arg是构造参量的注入:public testbean(){  //你的构造函数没有参数配置
    this.user = user;} 这样怎么能注入进去呢??
      

  2.   


    应改为:
    public testbean(userbean object){
    this.user = object; 
    }
      

  3.   

    添加一个 bean 的set方法
      

  4.   

    额。。呵呵 确实确实确实。。不好意思 个人疏忽了。。我晕。。居然烦了这种错误。。哎。。对不起自己了 。。
    可是现在有个新个问题呵呵 保证是最后一个啊!!!
    这个是刚改过的testbean.java
    public class testbean {

    static userbean user;
    public testbean(userbean user){
    this.user = user;

    }
    public void fangfa(){
    user.setUsername("asd");

    System.out.println(user.getUsername());

    }

    public static void main(String[] args){


    new testbean(user).fangfa();


    }

    }
    运行后为什么还是有异常呢?
    异常信息:Exception in thread "main" java.lang.NullPointerException
    at com.spring.beans.testbean.fangfa(testbean.java:15)
    at com.spring.beans.testbean.main(testbean.java:24)
    为什么会是空指针。。难道是没有注入进来嘛??
      

  5.   

    额 这个问题解决了 我自己又修改了一下 是这样的
    public class testbean {

     userbean user;
    public testbean(userbean user){
    this.user = user;

    } public void fangfa(){
    user.setUsername("asd");

    System.out.println(user.getUsername());

    }

    public static void main(String[] args){

    userbean user = new userbean();
    testbean t = new testbean(user);
    t.fangfa();


    }

    }但是有一个弄不明白 希望大家给我解释一下 我在上面先声明了以个USERBEAN对吧 然后构造注入的USERBEAN给了 最上面的USER
    但是我明明是在MAIN里又创建了一个新的USERBEAN对象啊 为什么他还是成功而不是NULL异常呢??我觉得按理说这个对象里应该是NULL的啊麻烦大家不厌其烦告诉小弟一下 嘿嘿 谢谢啦
      

  6.   

    哦  好像是明白了 是不是因为构造函数里的USER对象他本身是NULL的  然后我在MAIN里NEW的USER才给构造里传然后根据这个传进来的USER在找到XML配置文件 在赋值给了 我最上面声明的USER???这样理解对ma??
      

  7.   

    正解.
    你可以BYNAME BYTYPE都可以的.public testbean{User user){  //这样就OK了. 
    this.user = user; } 
      

  8.   

    好像蛮有道理,但是不对lz需要去查资料明确一下application与web程序入口点的概念~~~~对于你的这种说法,我建议你这样来体验下:
    将你的bean改成action类,然后通过对action的请求让spring实例化一个action。在main()方法中加上断点。或者public static void main(String[] args) {
            System.out.println("main run");
        }看看main方法中的断点是否断掉或者说是否输出main run。
    另外对于application程序,入口点是main方法。但是如果想要使用spring的话。需要实例化Spring的ApplicationContext。
      

  9.   


    System.out.println("测试UBB~~~");
      

  10.   

    pizzame
    自从你升星以后
    你回答问题的次数和你回答问题的详细程度成反比啊
      

  11.   

    testbean.java 
    public class testbean { userbean user; 
    public testbean(userbean user){ 
    this.user = user; } 
    public void fangfa(){ 
    user.setUsername("asd"); System.out.println(user.getUsername()); } public static void main(String[] args){ Resource resource = new FileSystemResource("applicationContext.xml");
    BeanFactory factory = new XmlBeanFactory(resource);
    testbean t = (testbean) factory.getBean("testbean");

    t.fangfa(); 
    } } 
      

  12.   

    还是给你一个注释吧:
    applicationContext.xml为你的spring配置文件,这里需要使用文件来初始化spring的bean工厂,初始化spring的bean工厂后,就可以用spring的bean工厂来获得每一个bean了,当获得testbean这个bean时,由于在spring的bean配置文件中定义了构造注入,于是spring的bean工厂会首先"生产"出user这个类的对象,并反射调用testbean的带有一个user类形参数的构造方法,将user这个类的对象传给他,通过这个构造方法初始化这个bean(testbean)的对象.