EDDGA 2009-10-25 12:40 采纳率: 0%
浏览 217
已采纳

[Spring] 请教,实例生成的时候,实例属性如何自动注入?

我有如下3个类,分别是Soldier、Gun和Bullet,可是getBean()之后Spring返回给我的不是一个完成了属性注入的soldier,请问何解?
Soldier:
[code="java"]
public class Soldier {

private Gun gun = null;

public Soldier() {
    System.out.println("Inside soldier's constructor: soldier is here, gun is ready? - " + String.valueOf(this.gun != null));
}

public Gun getGun() {
    return this.gun;
}

public void setGun(Gun arg_gun) {
    this.gun = arg_gun;
}

public static void main(String arg[]) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    Soldier soldier = (Soldier)ac.getBean("soldier");
    System.out.println("In the Main: soldier has a gun? - " + String.valueOf(soldier.getGun() != null));
    System.out.println("In the Main: soldier's gun is loaded? - " + String.valueOf(soldier.getGun().getBullet() != null));
}

}
[/code]

Gun:
[code="java"]
public class Gun {

private Bullet bullet;

public Gun() {
    System.out.println("Inside gun's constructor: gun is here, bullet is ready? - " + String.valueOf(this.bullet != null));
}

public Bullet getBullet() {
    return this.bullet;
}

public void setBullet(Bullet arg_bullet) {
    this.bullet = arg_bullet;
}

}
[/code]

Bullet:
[code="java"]
public class Bullet {

public Bullet() {
    System.out.println("Inside bullet's constructor: bullet is ready");
}

}
[/code]

XML:
[code="xml"]



<bean id="gun" class="Gun" depends-on="bullet">
    <property name="gunType" value="AK-47" />
    <property name="bullet" ref="bullet" />
</bean>

<bean id="bullet" class="Bullet" />


[/code]

输出:
[quote]
Inside bullet's constructor: bullet is ready
Inside gun's constructor: gun is here, bullet is ready? - false
Inside soldier's constructor: soldier is here, gun is ready? - false
In the Main: soldier has a gun? - true
In the Main: soldier's gun is loaded? - true
[/quote]

通过getBean得到了soldier,可是gun和bullet均“==null”;而当调用soldier的getGun()和gun的getBullet(),才能看到gun和bullet均“!=null”了。

请问:
1、如果main里不调getter,spring是否只初始化了各个实例,却不完成属性注入?
2、有没有什么办法,使getBean的来的soldier,让spring自动完成所有的注入,返回一个属性完整的soldoer?

谢谢
[b]问题补充:[/b]
嗯谢谢。

我想找到一种方法,让getBean()得到soldier已经能够有完整的属性(包括gun以及gun.bullet)而不必事先手动调用setter。我在想bean后处理器能否实现这样的功能?抑或有其他方法?

  • 写回答

2条回答 默认 最新

  • CaiHuajiang 2009-10-25 17:31
    关注

    [code="java"]#

    [/code]

    第一,通过从这里取出的bean都是已注入好了的,setter是必然的。而之后使用getter的方法取出的bean都是完整的。
    二,这里是使用的属性注入,当然也可以使用构造函数注入,其效果是一样的,就不会调用setter方法了。
    [url]http://hi.baidu.com/peng3409/blog/item/925d3af3ff9f9755352acc1f.html[/url]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)