преобразование переменной java в бобы - PullRequest
0 голосов
/ 08 января 2020

Я работаю над приложением весенней загрузки. Я хочу определить переменную в файле класса как 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 строк кода) только один раз при запуске приложения, а затем использовать их везде, где это требуется в классах приложения. Как я могу добиться этого с бобом? Или есть какой-то другой лучший способ добиться этого?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Создайте новый класс и используйте аннотацию @Configuration для загрузки bean-компонентов при запуске приложения.

@Configuration
public class SpringConfiguration{

    @Bean
    public Configuration getConfigurationBean(){
        return new Configuration();
    }
}
0 голосов
/ 08 января 2020

Одна вещь, которую вы можете сделать, это поместить инстанцирование и инициализацию переменных в их собственный метод и аннотировать каждый метод аннотацией @Bean.

Если вы сделаете это, вы должны аннотировать класс с помощью @Configuration.

Ваш 2 метода будут выглядеть примерно так:

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

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

Кроме того, если вы не хотите создавать экземпляр Configuration в виде отдельного компонента, вы можете объедините 2 вышеуказанных метода.

======= ОБНОВЛЕНИЕ, чтобы ответить на вопрос в комментарии =======

Если вы хотите использовать только что определенный Template например, в других классах вам нужно пометить эти классы с помощью @Component, чтобы они тоже стали бобами.

Пример:

@Component
public class OtherClassBean {
    private final Template template;

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

, пожалуйста, будьте осторожны, потому что здесь отныне вы не можете вручную создать экземпляр OtherClassBean, что означает, что строка, подобная new OtherClassBean(...), неправильна в 99% случаев и может привести к непредвиденному поведению.

Это потому, что подразумеваются все компоненты быть управляемым весной, которая может быть достигнута ved, если Spring создает экземпляры этих классов.

Единственное исключение из этого практического правила - в моем первоначальном ответе, где вы создаете экземпляр компонента в методе, аннотированном @Bean.

I Знайте, что для большинства людей, пытающихся выучить это, запутанная тема c, поэтому не стесняйтесь задавать больше вопросов.

...