Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring注入-接口和类_Java_Spring - Fatal编程技术网

Java Spring注入-接口和类

Java Spring注入-接口和类,java,spring,Java,Spring,我希望能够在我的类中调用接口,但让spring在幕后用正确的实现类实例化它们 也就是说,通常你可以做: IClass clz = new Class(); 我想要一行iclassclz最好在方法的中间(或者作为一个属性,如果不能完成),在这里,CLZ被实例化到我要在Spring中的类。p> 我之所以想这样做,是因为我希望能够通过编辑上下文文件来更改我想要使用的实现 更好的方法是知道如何使用期望参数的类构造函数执行上述操作。i、 e.新类(ar1,arg2) 我希望这是有道理的。任何帮助都将不胜

我希望能够在我的类中调用接口,但让spring在幕后用正确的实现类实例化它们

也就是说,通常你可以做:

IClass clz = new Class();
我想要一行
iclassclz最好在方法的中间(或者作为一个属性,如果不能完成),在这里,CLZ被实例化到我要在Spring中的类。p>
我之所以想这样做,是因为我希望能够通过编辑上下文文件来更改我想要使用的实现

更好的方法是知道如何使用期望参数的类构造函数执行上述操作。i、 e.
新类(ar1,arg2)


我希望这是有道理的。任何帮助都将不胜感激。

您可以让您的类实现BeanFactoryAware,然后Spring将在您的类中注入bean工厂。如果您想获得实现接口的类的实例,可以说:

beanFactory.getBean(IClass.class);

如果有多个bean实现同一接口,则必须按名称解析。要在每次请求时创建新对象,请将请求的bean的bean范围设置为“prototype”。

您可以包含如下代码:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
IClass clz = (IClass) context.getBean("beanName");
并不是说这本身比Gerco的答案更好,顺便说一句,只是这是一个选择,取决于你想做什么

您还可以实现ApplicationContextAware接口:我发现使用ApplicationContext可以为我提供具有填充属性的bean,例如,如果您有一个app.properties文件,其中包含您希望在Spring配置中解析的键/值属性对,通过BeanFactory调用检索的bean可能无法解析这些问题


有关详细信息,请参阅此项。

您是否尝试过此操作并遇到问题?或者你只是问“Spring支持IoC吗?”。我只看到您描述了Spring(和IoC/DI)的用途。只要您在代码中创建ApplicationContext,Spring就会解析属性、占位符等,并在setBeanFactory()中向您传递对ApplicationContext的引用。每个ApplicationContext也是一个BeanFactory,所以当您只需要getBean()时,BeanFactoryAware就可以正常工作。如果您还想访问特定于应用程序上下文的其他方法,请使用ApplicationContextAware.True,但通常使用ApplicationContext可能更安全。我永远也记不清这件事的细节了——其中一件事你解决了一次,然后从那一点开始一切都“正常”。尽管我注意到Spring文档本身现在提倡:使用ApplicationContext而不是BeanFactory,除非你有理由不这样做。是否可以使用propertyplaceholders,但在运行时传递所需的值?babyangel86-非常确定你可以在运行时覆盖它们,是的。请记住,Spring对象仍然只是对象——从ApplicationContext检索setXXX()方法后,您始终可以调用它们。这可能需要两步操作:第一步是获取对象,第二步是设置任何新的期望值。谢谢大家。这两种解决方案的组合就是dr所要求的!