Bean singleton, создание и инициализация сеанса - PullRequest
0 голосов
/ 29 июня 2018

Я не знаю, является ли это лучшим способом для реализации моего решения:

@Component
@Scope("singleton")
public class GetFromJson implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -8203722696439228358L;
    Map<String, Map<String, ArrayList<String>>> jsonMap;

    public Map<String, Map<String, ArrayList<String>>> getJsonMap() { 
        return jsonMap;
    }

    public void setJsonMap(Map<String, Map<String, ArrayList<String>>> jsonMap) {
       this.jsonMap= jsonMap;
    }    
}

Класс является Сериализуемым, потому что я получаю контент из Json из базы данных и сопоставляю контент в Object GetFromJson (мне нужно выполнить запрос в базе данных только один раз). По этой причине мне нужно использовать объект во всех моих приложениях, поэтому я думаю, что мне нужно использовать Singleton

Кто-то опубликовал мне библиотеку, чтобы получить JSON из базы данных. объект JSON анализирует Map<String, Map<String, ArrayList<String>>>, поэтому я создаю свой класс GetFromJson.

Теперь у меня много Служб отдыха, в моих службах отдыха мне нужно использовать мой объект: GetFromJson, чтобы получить содержимое jsonMap.

У меня много вопросов.

С аннотацией @Scope("singleton") Я гарантирую, что GetFromJson будет доступен только один экземпляр во всех моих приложениях?

Или как лучше иметь в Spring одноэлементный и сессионный объект, доступный в моем приложении?

Для доступа к содержимому jsonMap из GetFromJson достаточно использовать

@Autowired
private GetFromJson jsonObject;

Или как я могу получить мой синглтон-класс?

и в моем методе отдыха службы использовать:

 jsonObject.getJsonMap();

Как инициализировать мой синглтон, потому что я пытаюсь инициализировать мой объект с помощью:

@Autowired
private GetFromJson jsonObject;


public methodToInitialize(){
    jsonObject = methodLibraryFromDatabase(GetFromJson.class);
}

И IDE скажите мне, что инициализация поля не используется

Мне нужна та же логика, но с сеансом Object, я думаю, что если я пойму, что синглтон-реализация с моим объектом сеанса будет такой же, но только с изменением аннотации на: @Scope("session")

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я думаю, что OP хочет инициализировать POJO на основе базы данных один раз в жизненном цикле приложения и автоматически подключать его при необходимости.

Как правило, это делается путем создания bean-компонента (которые являются синглетонами, если не указано иное) и автоматического подключения его при необходимости.

Этот пример должен помочь вам начать работу.

@Configuration // beans are declerated in @Configuration classes
public class GetJsonInitializer {

    @Bean // singleton by default
    public GetFromJson jsonMap(){
        GetFromJson jsonObject = methodLibraryDatabase(GetFromJson.class);
        return jsonOBject;
    }
}

Теперь autowire GetFromJson в любом сервисе / компоненте Spring и т. Д.

@Service
public class SomeService {
    @Autowired
    private GetFromJson jsonMap;
}

Надеюсь, это поможет!

0 голосов
/ 29 июня 2018

bean-компонент, аннотированный сферой сеанса, будет привязан к жизненному циклу сеанса пользователя, то есть для каждого пользователя, обращающегося к вашему приложению, у вас будет экземпляр этого класса. Если вы хотите гарантировать только один экземпляр этого компонента в вашем приложении (на уровне JVM), вам просто нужно удалить аннотацию @Scope. Однако, если вы хотите смешать синглтоны с bean-объектами в сессионной области, вам следует просто позволить Spring обрабатывать все без проблем, ваши bean-компоненты области действия будут уничтожены только после завершения пользовательского сеанса.

Лучший способ обработки кода инициализации в вашем бине - это публичный метод, помеченный javax.annotation.PostConstruct

@PostConstruct
public void setUp() {
    //initialization code
}

Чтобы обработать код очистки, когда бин будет уничтожен, вы должны заставить свой класс реализовать org.springframework.beans.factory.DisposableBean или добавить метод, помеченный javax.annotation.PreDestroy

@PreDestroy
public void onDestroy() {
    //clean up code
}

Надеюсь, это помогло вам!

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