Spring одноэлементные створана некалькі разоў

У мяне ёсць кампанент, пэўны ў маім вясновым вэб-прыкладанні, і я чакаю, каб мець толькі адзін асобнік гэтага Біна, вось маё вызначэнне кампаненты:


У канструктару AccessControl я прысвоіць ідэнтыфікатар аб'екта, што нешта накшталт гэтага:

public class AccessControl {
   private long id = 0;
   public AccessControl() {
        id = System.currentTimeMillis();
   }

   public long getAccessControlId() {
        return id;
   }
}

У іншым класе, я спрабую дастаць асобнік AccessControl, нешта накшталт гэтага:

            ApplicationContext ctx =
                     new ClassPathXmlApplicationContext("acbean.xml");

            AccessControl ac = (AccessControl) ctx.getBean("accessControl");
            LOGGER_.info("AccessControl Identifier : " + ac.getAccessControlId());

Я чакаю «ID» значэнне быць такім жа, так як значэнне «ідэнтыфікатар» усталяваны ў канструктару і канструктар не павінен выклікацца зноў і зноў, але гэта менавіта тое, што адбываецца. Infact, я дадаў заяву часопіса ў канструктар і ствараецца новы аб'ект кожны раз.

Я прачытаў: HTTP: //www.digizenstudio.com/blog/2006/09/14/a-spring-singleton-is-not-a-singleton/ але я не думаю, што я маю справу з тым жа класам, вызначаным двойчы з двума рознымі ідэнтыфікатарамі боба і кантэкстам прыкладання з'яўляецца тое жа самым.

Можа хто-небудзь падзяліцца тым, што не так з тым, як я вызначыў боб?

Я таксама эксперыментавалі з одноплодной = «сапраўдным» і сферай = «Сінглтан», але яны не робяць differece.

Дзякуючы.

6
Ці з'яўляецца канструктар выклікаецца двойчы ці адзін раз кожны раз, калі вы выклікаеце getBean() ?
дададзена аўтар Tomasz Nurkiewicz, крыніца
Ці з'яўляецца гэтая частка кода ў Асноўны метад, які вы проста працуе зноў і зноў? Калі гэта так, то вы атрымаеце іншае значэнне кожны раз, як кожны раз, калі вы запускаеце, вы ствараеце новую JVM. Аб'екты не захоўваюцца на іх уласных знешнім асобнік віртуальнай машыны Java, гэта значыць тое, што вам трэба будзе зрабіць самастойна (верагодна, з базай дадзеных).
дададзена аўтар nicholas.hauschild, крыніца
На жаль, я не ведаю адказу на гэтае пытанне. Паводле дакументацыі, яна павінна даць мне адзін і той жа аб'ект зноў і зноў, а гэта азначае, што ён не павінен выклікаць канструктар наогул пасля таго, як у першы раз. Зыходзячы з таго, што я бачыў, канструктар атрымлівае пад назвай кожны раз я называю «getBean (...)», якая з'яўляецца прама супрацьлеглае таму, што сказана ў дакументацыі
дададзена аўтар user305210, крыніца
Яе WebApplication і да тых часоў, як прыкладанне не перазапускаецца, новы асобнік JVM не павінен прыйсці ў карціну
дададзена аўтар user305210, крыніца

3 адказы

singelton-Нес ў вясной у кантэксце прыкладання, кожны раз, калі вы ствараеце новы асобнік кантэксту прыкладання (напрыклад, у першым радку ў вашым другім прыкладзе кода) усё одноэлементные инстанцируются.

Вы павінны мець адзіны кантэкст прыкладання і выкарыстоўваць яго вакол у вашым дадатку

16
дададзена
так, гэта тое, што гэтая памылка. Я не спрабаваў сваё рашэнне, але пакуль я 100%, што гэта тое, што стварае праблему. Дзякуючы.
дададзена аўтар user305210, крыніца

Вы ствараеце новы кантэкст прыкладання з кожным выклікам:

ApplicationContext ctx = new ClassPathXmlApplicationContext("acbean.xml");

Такім чынам, вы ў канчатковым выніку з новай спружыннай кантэйнера, што азначае, што вашы бабы усё нанова створаны новы кантэйнер.

Акрамя таго, вы згадалі, што ў вас гэта ў вэб-дадатку. Калі так, то вам трэба дазволіць вэб-дадатак для загрузкі кантэксту спружыны і атрымаць і выкарыстаць гэты кантэкст па меры неабходнасці.

Дадаць у web.xml:


    Core Spring context.
    contextConfigLocation
    /WEB-INF/classes/applicationContext.xml


    Spring loader.
    org.springframework.web.context.ContextLoaderListener

ці нешта падобнае. Атрымаць вэб-кантэкст праз ServletContext па меры неабходнасці.

Яшчэ адна заўвага: адна кропка спружыны, каб забяспечыць інверсію кантролю, звычайна з увядзеннем залежнасцяў. Вы павінны разгледзець магчымасць спружыне ўводзіць якія-небудзь залежнасці для вас, а не атрымаць кантэкст і пацягнуўшы бабы сябе.

7
дададзена
Дзякуем Вам за гэта. Я не ведаў пра гэта падыходзе, але я шукаў нешта падобнае сабе.
дададзена аўтар user305210, крыніца

У Spring дадатак, якое вы не павінны відавочна стварыць кантэкст прыкладання самастойна.

У ідэале одноплодной варта ўводзіць у свой клас, ці вы павінны рэалізацыі ApplicationContextAware ( дакументы і некаторыя нататкі ). Я аддаю перавагу ін'екцыю; прасцей.

2
дададзена