スプリングすぐBeanタイプ/ビーン-singleton
等スコープ(アプリケーション・コンテキストごとに1つだけのBean)
-prototypeビーン(要求ごと新しいBean)春 - プロトタイプビーンシングルトン豆内部が場合
を有しますシングルトンBean内のプロトタイプBeanへの参照であり、シングルトンBeanへのリクエストごとに新しいプロトタイプBean(シングルトンBeanの内部にある)を取得する方法があります。
「はい」の場合、設定はどのようになりますか?
スプリングすぐBeanタイプ/ビーン-singleton
等スコープ(アプリケーション・コンテキストごとに1つだけのBean)
-prototypeビーン(要求ごと新しいBean)春 - プロトタイプビーンシングルトン豆内部が場合
を有しますシングルトンBean内のプロトタイプBeanへの参照であり、シングルトンBeanへのリクエストごとに新しいプロトタイプBean(シングルトンBeanの内部にある)を取得する方法があります。
「はい」の場合、設定はどのようになりますか?
シングルトンBeanにApplicationContextを注入し、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}
ニース、それは私の答えよりも優れています。 –
は、なぜあなたはこれを必要でしょうか? –