将 java 变量转换为 spring beans

converting java variable to spring beans

我正在开发 spring 启动应用程序。我想在 class 文件中将一个变量定义为 bean,以便它只被初始化一次。下面是源代码。

Configuration cfg = new Configuration();

//Load template from source folder
Template template = cfg.getTemplate("src/helloworld.ftl");

// Build the data-model
Map<String, Object> data = new HashMap<String, Object>();
data.put("message", "Hello World!");

// Console output
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);
out.flush();

我想在应用程序启动期间仅初始化一次配置对象 cfg 和模板(开始 2 行代码),然后在应用程序 classes 中需要的任何地方使用它们。 我怎样才能用bean做到这一点? 或者有没有其他更好的方法来实现这个?

您可以做的一件事是将变量的实例化和初始化放在它们自己的方法中,并使用 @Bean 注释对每个方法进行注释。

如果你这样做,你应该用 @Configuration.

注释 class

你的两种方法看起来像这样:

@Configuration
public class ConfigurationBean {
    @Bean
    public Configuration configuration() {
        return new Configuration();
    }

    @Bean
    public Template template() {
        return configuration().getTemplate("...");
    }
}

此外,如果您不想将 Configuration 实例化为单独的 bean,您可以合并上面的 2 个方法。

=======更新以回答评论中的问题=======

如果你想在其他classes中使用新定义的Template bean,你需要用@Component注释那些classes,这样它们也变成了豆子。

一个例子:

@Component
public class OtherClassBean {
    private final Template template;

    public OtherClassBean(Template template) {
        this.template = template;
    }
}

这里请注意,因为从现在开始,你不能手动实例化OtherClassBean,这意味着像new OtherClassBean(...)这样的一行在99%的情况下都是错误的,并且可能会导致意想不到的结果行为。

这是因为所有 bean 都应由 Spring 管理,只有 Spring 实例化那些 classes 才能实现。

这个经验法则的唯一例外是在我最初的回答中,您在用 @Bean.

注释的方法中实例化了一个 bean

我知道对于大多数试图学习这个的人来说这是一个令人困惑的话题,所以不要害羞问更多问题。

创建一个新的 class 并在应用程序启动时使用 @Configuration 注释加载 bean。

@Configuration
public class SpringConfiguration{

    @Bean
    public Configuration getConfigurationBean(){
        return new Configuration();
    }
}