在 Spring 中实例化一个 POJO 设置 class,并使其可从所有代码访问

Instantiate a POJO setting class in Spring, and make it accessible from all code

我是 Spring 的新手,在尝试创建一个所有参数都由外部表单填充的 class 时遇到问题。但我想让这个实例成为唯一的,并且可以从项目其余部分的每个 class 访问,因为到目前为止该对象正在重新实例化,所以我没有保存我的设置。 我不知道是否有这方面的注释,以及我如何能够在任何其他 class.

中感染这个实例
@Data
@Builder
public class ProjectConfiguration {

    //InputFile
    File midiFile = null;
    private String resourcesPath;
    private Sequence sequence;

    //OutputFile
    private String exportPath;
    private String exportFile;

    //Video
    private int width;
    private int height;

    //Audio
    private int sampleRate; // Hz

    //Preview
    private IMediaViewer.Mode viewMode;
    private boolean showStats;
}

你能给我一些指导吗?

我正在按照下面提供的指南更新代码,现在我有更多问题,但仍然无法正常工作。如果我使用 @Autowired ProjectConfiguration配置; 在另一个class中调用相同的配置它returns这个错误

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'com.kadathsound.midiread.MainView' 的 bean 时出错:通过字段 'configuration' 表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有 'com.kadathsound.midiread.model.config.ProjectConfiguration' 类型的合格 bean 可用:预期单个匹配 bean 但找到 2:projectConfiguration,getInstance

如果我删除 @Autowired,则会收到 NullPointer 异常,因为它仍在创建新实例。 这是新代码。请帮我。我完全迷失了这个。我阅读的所有文档都对我没有帮助,因为情况不同。

@Data
@Configuration
@NoArgsConstructor
public class ProjectConfiguration implements Serializable {

    private File midiFile;
    private String resourcesPath;
    private Sequence sequence;
    private String exportPath;
    private String exportFile;
    private int width;
    private int height;
    private int sampleRate;
    private IMediaViewer.Mode viewMode;
    private boolean showStats;

    private static volatile ProjectConfiguration instance = null;

    @Bean
    public static ProjectConfiguration getInstance() {
        if (instance == null) {
            synchronized(ProjectConfiguration.class) {
                if (instance == null) {
                    instance = new ProjectConfiguration();
                }
            }
        }
        return instance;
    }
}

您可以为此 class 创建一个 bean 并使其可用于整个应用程序。您可以创建一个用@Configuration 注释的配置文件。声明一个方法,该方法 return 是您要使用 @Bean 注释的 class。在方法内部构建 class 使用您以某种方式收集的值 return 构建的 class.

您可以在@Autowired 的帮助下访问该 bean。

我认为这有帮助!!!

@Configuration
public class AppConfig {

    /** build your class like this with all the necessary values
     * and the spring will create the initial object for you and
     * inject those into all the dependent classes
     * @return
     */
    @Bean
    public ProjectConfiguration projectConfiguration(){
        return ProjectConfiguration.builder()
                .resourcesPath(...)
                .sequence(...)
                .build();
    }
}

参考资料:https://www.javaguides.net/2018/09/spring-bean-annotation-with-example.html