我正在尝试使用AbstractFactoryBean
来获取特定的bean作为原型,基本上每次使用这个bean我想要创建一个新对象。
我已经提到了春季文档,他们提到仅仅覆盖isSingleton
是不够的,还必须实现SmartFactoryBean
。
此外,我不想急于初始化bean并覆盖destroy
方法。
但是我的bean被早期初始化,即一旦应用程序启动会话已经开始。即使在web请求中使用bean之后,会话也没有被破坏。
任何人都可以请帮助
package com.rokitt.es.factories;
import org.apache.spark.SparkConf;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.SmartFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class SparkSessionFactoryBean extends AbstractFactoryBean<SparkSession> implements SmartFactoryBean<SparkSession> {
@Value("${spark.master}")
private String sparkMaster;
@Override
public Class<?> getObjectType() {
return SparkSession.class;
}
@Override
protected SparkSession createInstance() throws Exception {
return SparkSession.builder().appName("{assign based on class in which injected}")
.master(sparkMaster)
.config(new SparkConf()
.set("getSparkSession.serializer", "org.apache.getSparkSession.serializer.KryoSerializer")
.set("getSparkSession.kryoserializer.buffer", "24mb")
.set("getSparkSession.rdd.compress", "true")
.set("getSparkSession.extraJavaOptions", "-XX:+UseCompressedOops -XX:+UseG1GC -Djava.security.egd=file:///dev/urandom")
.set("getSparkSession.executor.memory", "4g")
.set("getSparkSession.es.batch.size.bytes", "20mb")
.set("getSparkSession.es.batch.size", "10000")
.set("getSparkSession.es.nodes", "localhost:9200"))
.getOrCreate();
}
@Override
protected void destroyInstance(SparkSession instance) throws Exception {
instance.stop();
}
@Override
public boolean isPrototype() {
return true;
}
@Override
public boolean isEagerInit() {
return false;
}
@Override
public boolean isSingleton() {
return false;
}
}
答案 0 :(得分:0)
如果你想使用特定的Spring bean作为原型,也许查找方法可以帮助你: https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-method-injection
原型没有急切地初始化,也不支持破坏方法。