Создание, обновление и управление Spring Bean - PullRequest
0 голосов
/ 06 февраля 2019

Я в настоящее время пытаюсь понять бобы в Spring.Я пытаюсь понять Beans по сценарию, который в настоящее время происходит в моем проекте.У меня есть приложение Spring в контейнере Docker.Во время запуска мое приложение должно создать тяжелый экземпляр, создание которого занимает много времени.Мое приложение подключено через очередь сообщений.Каждый раз, когда мое приложение получает сообщение, оно должно использовать мой тяжелый экземпляр для продолжения работы с сообщением.

Я понимаю, что bean-компонент Spring по умолчанию является Singleton, и без какой-либо конфигурации невозможно создать другой экземпляр.Spring всегда будет использовать первый экземпляр при первом вызове.

Теперь я хочу создать класс обычного пользователя, который содержит объект.aObject был создан во время запуска и имеет всю информацию, которая мне нужна.Если я обновлю сейчас мой aObject с updateAObject ().Изменит ли мой aObject новое значение для всех классов, которые используют мой класс CustomeA?Нужно ли мне решать проблемы с параллелизмом?

Я написал Junittest, но не могу подтвердить, что мое решение -ok-

Извините за мой не очень хороший английский.Я пытаюсь поправиться.

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class CustomeA {

    private ClassA aObject;

    public ClassA() {
        this.aObject = createHeavyCostInstance();
    }

    public ClassA createHeavyCostInstance() {
        // do something here that takes long time to do
        return object;
    };

    public ClassA updateAObject() {
        this.aObject = update();
    }

    // Getter and Setter
}

@Configuration
@ComponentScan("com.package.config.dummy")
public class AppConfig {

}

//TestClass
@Test
public void testConfig() {
    AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext(AppConfig.class);

    ClassA classA = context.getBean(ClassA.class);
    classA.getAObject();
    classA.setAObject(new Object());
    ClassA classA_two = context.getBean(classA.class);
    classA_two.getAObject();
    context.close();
}

1 Ответ

0 голосов
/ 06 февраля 2019

Вы переназначаете aObject внутри CustomeA.updateAObject.Любой класс за пределами CustomeA все еще имеет более старую ссылку, а не более новую ссылку.Вместо этого вы должны изменить CustomeA.updateAObject так, чтобы атрибуты объекта, соответствующие ссылке aObject, обновлялись.Таким образом, все классы со ссылкой aObject могут видеть обновленный объект, который соответствует ссылке aObject.

Ваша путаница состоит в том, что вы не понимаете разницу между объектом и ссылкой наобъект.aObject является ссылкой на базовый объект.aObject не является объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...