【发布时间】:2010-01-26 19:30:31
【问题描述】:
在 xml 文件中连接好 bean 后,如何实例化对象?
是不是就像:
Myobject myObject = new MyObject();
幕后的弹簧会根据类型执行查找?
还是必须使用applicationContext?
【问题讨论】:
标签: java spring dependency-injection
在 xml 文件中连接好 bean 后,如何实例化对象?
是不是就像:
Myobject myObject = new MyObject();
幕后的弹簧会根据类型执行查找?
还是必须使用applicationContext?
【问题讨论】:
标签: java spring dependency-injection
我相信这就是你要找的 -> http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-client
基本上归结为getBean() 方法:
MyObject obj = (MyObject) ctx.getBean("myObject");
当然,在 web 上下文中,或者在其他一些环境中,您可能会从其他地方获取 ctx(spring 上下文),因此您不需要手动创建它。
【讨论】:
也可以通过获取应用上下文并调用getBean来获取对象:
ApplicationContext appContext =
WebApplicationContextUtils.getRequiredWebApplicationContext( servletContext );
return appContext.getBean( beanName );
您可以通过实现 ServletContextAware 并在您的代码中创建适当的设置器来获取您的 servlet 上下文。
【讨论】:
当您的应用程序服务器启动时,Spring 将为您进行实例化。并且还将“注入”你的类中的对象。
因此,为了实现注入,您要么必须编写一个 setter 方法(一旦对象被实例化,Spring 就会调用该方法)
public class MyClass{
private MyObject myObject;
public void setMyObject(MyObject _myObject){ //Spring will call this method
this.myObject = _myObject;
}
}
或者你可以有一个基于构造函数的注入
public class MyClass{
private MyObject myObject;
public MyClass(MyObject _myObject){ //Spring will call this constructor
this.myObject = _myObject
}
}
编辑: 感谢您指出彼得 D
在您的 XML 配置文件中,您必须执行以下操作:
<bean name="myObject" class="mypackage.MyObject"/>
<bean name="myClass" class="mypackage.MyClass">
<property name="myObject" ref="myObject"/>
</bean>
希望这会有所帮助!
【讨论】:
按照你描述的方式,它行不通。 Spring 不会修改普通对象的创建方式。要使用 Spring 注入,即获取对 Spring bean 的引用,您可以:
总而言之,要得到一个bean,你不能创建它,而是让Spring把它交付给你。
【讨论】:
依赖注入的神奇之处在于您无需查找引用,尽管您可以通过编程方式完成。
<bean name="myObject" class="x.y.MyObject"/>
<bean name="anotherObject" class="x.y.Foo">
<property name="myObjectProperty" ref="myObject"/>
</bean>
此外,您可以定义对象应该是“单例”还是原型(每个请求一个实例)。
希望对你有帮助
【讨论】: