AbstractFactoryBean用于获取特定bean作为原型并且eager初始化为false

时间:2017-01-03 14:22:06

标签: java spring spring-boot

我正在尝试使用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;
}
}

1 个答案:

答案 0 :(得分:0)

如果你想使用特定的Spring bean作为原型,也许查找方法可以帮助你: https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-method-injection

原型没有急切地初始化,也不支持破坏方法。