Spring具有bean类型/作用域,如
-singleton bean(每个应用程序上下文只有一个bean),
-prototype bean(每个请求一个新bean)
现在,如果在单例bean中有对原型bean的引用,是否有办法在对单例bean的每个请求中获得一个新的原型bean(在单例bean中)。< br >如果是,配置会是什么样的?
在单例bean中注入Application Context并使用getBean方法获取原型。
@Autowired
private ApplicationContext ctx;
public void request() {
MyProptotypeBean mpb = this.ctx.getBean(MyProptotypeBean.class);//new instance for evety call to the method
}
有一种方法可以使用这样的查找方法:
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
public final class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
for (int i = 0; i < 10; i++) {
System.out.println(i + ".- call: " + applicationContext.getBean(Singleton.class));
}
}
@ComponentScan("foo")
@Configuration
public static class Config {
// It's important to define SingletonBase component with @Component annotation and not here, If you define SingletonBase initialization here, It'll not work!
@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public Prototype prototype() {
return new PrototypeBase();
}
}
public interface Prototype {
public long getInstanceId();
}
public interface Singleton {
public Prototype getPrototype();
}
// It's important define SingletonBase component as this, If you define SingletonBase initialization inside a factory it'll not work!
@Component
public static class SingletonBase implements Singleton {
private static long instanceIdGenerator = 1L;
private long instanceId = generateId();
private static synchronized long generateId() {
return instanceIdGenerator++;
}
public SingletonBase() {
System.out.println("Singleton initialized!");
}
@Override
public String toString() {
return "SingletonBase{" + "instanceId=" + instanceId + ", prototypeId=" + getPrototype().getInstanceId() + '}';
}
@Override
@Lookup
public Prototype getPrototype() {
return null;
}
}
public static class PrototypeBase implements Prototype {
private static long instanceIdGenerator = 1L;
private long instanceId = generateId();
private static synchronized long generateId() {
return instanceIdGenerator++;
}
public PrototypeBase() {
System.out.println("Prototype initialized!");
}
public long getInstanceId() {
return instanceId;
}
}
}
它打印:
Singleton initialized!
Prototype initialized!
0.- call: SingletonBase{instanceId=1, prototypeId=1}
Prototype initialized!
1.- call: SingletonBase{instanceId=1, prototypeId=2}
Prototype initialized!
2.- call: SingletonBase{instanceId=1, prototypeId=3}
Prototype initialized!
3.- call: SingletonBase{instanceId=1, prototypeId=4}
Prototype initialized!
4.- call: SingletonBase{instanceId=1, prototypeId=5}
Prototype initialized!
5.- call: SingletonBase{instanceId=1, prototypeId=6}
Prototype initialized!
6.- call: SingletonBase{instanceId=1, prototypeId=7}
Prototype initialized!
7.- call: SingletonBase{instanceId=1, prototypeId=8}
Prototype initialized!
8.- call: SingletonBase{instanceId=1, prototypeId=9}
Prototype initialized!
9.- call: SingletonBase{instanceId=1, prototypeId=10}
通常在Spring上下文中,如果原型bean被注入到单例bean中,父类的属性将重写原型bean作用域。但是,如果在原型bean作用域中注入一个单例作用域bean会发生什么。仍然使用内部bean的get bean会返回内部bean的新实例吗?
问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输
假设有两个类ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果我们将ClassA的作用域定义为singleton,而将ClassB的作用域定义为Prototype,那么每次创建ClassA的bean实例时ClassB的实例会发生什么?每次返回ClassA实例时,会返回相同的ClassB实例还是创建新实例? 谢谢!!!
我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方
我目前有一个简单的bean作为pojo,我正在将其注入到工作线程中,工作线程是用定义的。 我发现bean被正确地注入到原型中,被重新初始化,并且所有的值都返回。 下面是注入的代码: POJO: } 我知道bean正在重新创建,因为调试器中的ID发生了变化,并且被打印到控制台。 用这种方式将单例注入到原型中有什么问题吗? 多谢了。
我有一个用于原型bean的FactoryBean,如下所示: 我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过,从获得一个新的原型实例: 但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean: 如何直接使用@autowired注入来实现?