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 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 Mac(标签-IDE|关键词-File) idea
  • ¥15 潜在扩散模型的Unet特征提取
  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器
  • ¥15 如何使用SC92F8003固件库解析私有协议数据?
  • ¥15 如何在音频中嵌入字符串(水印)信息进行传递
  • ¥30 plc怎么以设计说明书申请软著
  • ¥15 硬盘识别不了,需要初始化,可我的数据怎么办
  • ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)