gpt4 book ai didi

java - Spring可变实例数

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:55 25 4
gpt4 key购买 nike

我现在正在进入 Spring,我有一个问题。假设我们有一个接口(interface) IControl 并且我们有它的三个实现 - 例如按钮标签复选框。用户将在运行时输入一个数字 N,我应该创建特定类型的 N 控件(ButtonLabel复选框)。问题是我希望在程序运行之前配置此特定类型。例如,我在 spring.xml 中配置了我想要的按钮,然后程序运行,用户输入 10 并且我创建了 10 按钮.

<beans>
<bean id="controlCreator" class="org.company.ControlCreator">
<property name="controlType" ref="?!?!?!?!?!?!"/>
</bean>
</beans>

我应该如何配置它?

P.S 这只是我编的一个学习例子。

最好的问候,佩塔尔

最佳答案

首先,请允许我声明 Spring 并非旨在执行此操作。 Spring 想要一种将组件连接在一起的非侵入式方法。它并不意味着用于在运行时生成对象。

正确的做法

正确的方法是设计一个工厂类。您可以在启动时使用 Spring 设置它的默认值,然后在运行时向工厂询问实例。

侵入式方法

如果您真的想使用 Spring,您可以通过向 applicationContext 询问您的控件实例来进行侵入式操作。

默认情况下,所有 Spring bean 都是单例,但您可以将它们制作成原型(prototype)。

免责声明:代码未经测试,但应该是这样的:

Applicationcontext.xml

<beans>
<bean id="myButton" class="org.company.Control" scope="prototype">
<property name="controlType" value="button" />
</bean>

<bean id="controlCreator" class="org.company.ControlCreator" scope="singleton">
</bean>

</beans>

代码

public class controlCreator implements ApplicationContextAware {

private ApplicationContext appContext;

public Control createButton(){
// since this bean is prototype, a new one will be created like this
return getApplicationContext().getBean("myButton");
}


// ... getter and setter for applicationContext

}

非侵入式方法

如果你真的想使用 Spring,而且你真的想以非侵入式的方式使用它,你将不得不使用方法注入(inject)。将工厂方法注入(inject)您的类。

代码如下:

Applicationcontext.xml

<beans>
<bean id="myButton" class="org.company.Control" scope="prototype">
<property name="controlType" value="button" />
</bean>

<bean id="controlCreator" class="org.company.ControlCreator" scope="singleton">
<lookup-method bean="myButton" name="createButton"/>
</bean>

</beans>

代码

public class controlCreator implements ApplicationContextAware {

private ApplicationContext appContext;

public abstract Control createButton();


// ... getter and setter for applicationContext

}

这将在调用查找方法时返回 bean。由于 bean 是原型(prototype),因此它将创建一个新的。

关于java - Spring可变实例数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com