在Spring中,如何使用原型范围声明bean?默认情况下,Spring IOC中的bean会自动使用单例范围进行初始化。
答案 0 :(得分:6)
<bean id="your id" class="your class" scope="prototype" />
或标记@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
您正在使用注释
答案 1 :(得分:0)
除了@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
,我们还可以简单地写@Scope("prototype")
。还有几种方法可以通过编程方式创建Bean并设置其范围。例如:SingletonBeanRegistry's
registerSingleton
或BeanDefinition's
setScope
。
这是一个简单的示例,我们注册一个自定义bean并使用setScope
设置其范围:
package com.zetcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = "com.zetcode")
public class Application {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
var ctx = new AnnotationConfigApplicationContext(Application.class);
var beanFactory = (BeanDefinitionRegistry) ctx.getBeanFactory();
beanFactory.registerBeanDefinition("myBean",
BeanDefinitionBuilder.genericBeanDefinition(String.class)
.addConstructorArgValue("This is my bean")
.setScope("prototype")
.getBeanDefinition()
);
logger.info("{}", ctx.getBean("myBean"));
ctx.close();
}
}