2013-08-30 6 views
8

मैं वसंत, हाइबरनेट का उपयोग कर एक वेब अनुप्रयोग बना रहा हूं। मान लीजिए कि एकाधिक उपयोगकर्ता पंजीकरण करना चाहते हैं। मैं एक पंजीकरण बीन (प्रोटोटाइप या अनुरोध या सत्र स्कॉप्ड) बनाउंगा और इसे नियंत्रक में स्वचालित कर दूंगा।वसंत वेब अनुप्रयोग में नियंत्रकों, सेवा, रिपोजिटरी का दायरा?

अब मैं पंजीकरण सेवा ("@transactional" टिप्पणी के साथ एनोटेट) है, जिसकी controler में autowired है करने के लिए इस सेम गुजर रहा हूँ। यह सेवा डीएओ (यह डीएओ सेवा में autowired है) यदि करने के लिए registeration सेम वस्तु प्राप्त पारित करेंगे सेवाओं और डीएओ singelton would'nt अनुरोध एकाधिक उपयोगकर्ताओं के लिए ऊपर मिलाया जा रहे हैं?

यहाँ मैं क्या किया है है: मैं "अनुरोध" के रूप में सेवा और डीएओ की गुंजाइश पैदा की है। क्या यह सही दृष्टिकोण है? या सेवा और डीएओ सिंगलटन बनाने के लिए मैं और क्या कर सकता हूं?

अनुरोध के पीछे मेरा तर्क स्कॉप्ड: अनुरोध करने के लिए सेवा और डीएओ बनाने का कारण यह है कि यदि एकाधिक उपयोगकर्ता पंजीकरण सेवा.registerUser (बीन) कहते हैं; एक ही समय में नियंत्रक से और दायरा सिंगलटन है तो वहां कोई स्थिरता coz नहीं होगी, वहां एक वस्तु के तरीकों को विभिन्न इनपुट के साथ बुलाया जाता है।

मुझे पता है जहां मैं गलत हूँ।

registeration बीन

@Component(value="registerBean") 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request") 
public class RegisterBean { 


@NotNull 
private String userName; 

private String lastName; 
@NotNull 
private String firstName; 

String email_address; 
String password; 
String confirmPassword; 
String gender; 

//getters and setters 


} 

नियंत्रक

package com.ClickToShop.controllers; 






@Controller 
    @SessionAttributes("user_info") 
    public class LoginPageController { 




     RegisterBean registerBean;//used 

     RegisterationService registerationService;//used 



     @Autowired 
     @Qualifier("registerationService") 
     public void setRegisterationService(RegisterationService registerationService) { 
      this.registerationService = registerationService; 
     } 




     @Autowired 
     @Qualifier("registerBean") 
     public void setRegisterBean(RegisterBean registerBean) { 
      this.registerBean = registerBean; 
     } 



     @ModelAttribute(value = "registerBean") 
     RegisterBean returnModelAttribute() { 
      return registerBean; 
     } 

     @RequestMapping(value = "/login-page.html") 
     public String showLoginPage() { 
    System.out.println("Showing login page"); 
    System.out.println(registerBean); 
      return "login-page"; 

     } 



     @RequestMapping(value = "/newuser-register", method = RequestMethod.POST) 
     public String registernewuser(@ModelAttribute("registerBean") @Valid RegisterBean bean, BindingResult result,final RedirectAttributes redirectAttr) 
       throws NoSuchAlgorithmException, UnsupportedEncodingException { 
      //some validation code 

    registerationService.registerUser(bean); 



        return "redirect:successRegisteration"; 
       } 


     } 




    } 




Service Layer 

     @Service("registerationService") 
     @Transactional 
     @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value="request") 

     public class UserServiceImpl implements RegisterationService { 


      private User_Details_Pojo userToRegisterPojo; 
      private AbstractHibernateDAO UserDAO; 


      @Autowired 
      public void setUserDAO(AbstractHibernateDAO userDAO) { 
       UserDAO = userDAO; 
      } 



      @Autowired 
      @Qualifier("userToRegisterPojo") 
      public void setUserToRegisterPojo(User_Details_Pojo userToRegisterPojo) { 
       this.userToRegisterPojo = userToRegisterPojo; 
      } 




     //main implementation code starts here 

      @Override 

      public void registerUser(Object userBean) { 
       RegisterBean bean=(RegisterBean) userBean; 
       //bean or model is converted to pojo 


      UserDAO.save(userToRegisterPojo);//calling DAO with specified pojo 



      } 



     } 

डीएओ:

public abstract class AbstractHibernateDAO<T extends Serializable> { 

    public Class<T> clazz;//class object reference 

    protected SessionFactory mysessionFactory; 


    @Autowired 
    public void setMysessionFactory(SessionFactory mysessionFactory) { 
     this.mysessionFactory = mysessionFactory; 
    } 

    public T findOneByName(final String name){ 

     return (T) getCurrentSession().createQuery("from "+clazz.getName()).uniqueResult(); 
    } 


    public void setClazz(final Class<T> clazzToSet) { 
     this.clazz = clazzToSet; 
    } 

    public T findOne(final Long id) { 
     return (T) getCurrentSession().get(clazz, id); 
    } 

    @SuppressWarnings("unchecked") 
    public List<T> findAll() { 
     return getCurrentSession().createQuery("from " + clazz.getName()).list(); 
    } 

    public void save(final T entity) { 
     getCurrentSession().merge(entity); 
    } 

    public void update(final T entity) { 
     getCurrentSession().update(entity); 
    } 

    public void delete(final T entity) { 
     getCurrentSession().delete(entity); 
    } 

    public void deleteById(final Long entityId) { 
     final T entity = findOne(entityId); 
     delete(entity); 
    } 

    protected Session getCurrentSession() { 

     return mysessionFactory.getCurrentSession(); 
    } 
} 

कंक्रीट डीएओ

@Repository 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value="request") 
public class UserDAO extends AbstractHibernateDAO<User_Details_Pojo>{ 


} 

उत्तर

2

सेवाएं और डीएओ स्टेटलेस होना चाहिए। यह आपको स्प्रिंग सिंगलेट्स के रूप में कॉन्फ़िगर करने की अनुमति देगा। मुझे आशा है कि जब आप "सिंगलटन" कहें तो इसका मतलब यह होगा।

थ्रेड पूलिंग समेत सभी थ्रेडिंग चिंताओं को बुनियादी ढांचे का ख्याल रखा जाएगा: आपका वेब/जावा ईई सर्वर और स्प्रिंग डी।

+0

मान लीजिए कि एकाधिक उपयोगकर्ता पंजीकरण करना चाहते हैं। मैं प्रत्येक उपयोगकर्ता के लिए पंजीकरण बीन (प्रोटोटाइप, अनुरोध, सत्र स्कॉप्ड) तैयार करूंगा.अब मैं पंजीकरण सेवा में इस बीन को पास कर रहा हूं ("@transactional" एनोटेशन के साथ एनोटेटेड)। यह सेवा प्राप्त हो जाएगी डीएओ को पंजीकरण बीन ऑब्जेक्ट। अगर सेवा और डीएओ सिंगलटन हैं तो एकाधिक उपयोगकर्ताओं के लिए अनुरोधों को मिश्रित नहीं किया जाएगा? – beinghuman

+0

यह तब तक नहीं होना चाहिए जब तक आप डीएओ में हाइबरनेट सत्रों को प्रबंधित करने की कोशिश नहीं कर रहे हों। वसंत प्रति लेनदेन, हाइबरनेट सत्र सहित एक लेनदेन संदर्भ आवंटित करेगा। वेब सर्वर प्रत्येक उपयोगकर्ता के अनुरोध के अनुसार पूल से थ्रेड आवंटित/थ्रेड आवंटित करेगा। इसलिए दो उपयोगकर्ताओं के पंजीकरण सेम अलग-अलग मेमोरी स्थानों में "लाइव" होंगे और अलग-अलग हाइबरनेट सत्रों के माध्यम से संसाधित किए जाएंगे, और अलग-अलग डीबी कनेक्शन पर अलग-अलग लेन-देन में डेटाबेस में लिखे जाएंगे। – Olaf

+0

यह स्पष्ट हो जाएगा कि क्या आप मुझे यह समझा सकते हैं। कई अनुरोध आते हैं। वेब सर्वर प्रत्येक अनुरोध के लिए अलग थ्रेड आवंटित करता है। ये थ्रेड समान सिंगलटन नियंत्रक का उपयोग करता है जिसमें प्रोटोटाइप रजिस्टरबीन होता है? प्रत्येक थ्रेड को अलग मॉडल बीन कोज़ कैसे मिलेगा मैंने देखा है यदि सिंगलटन नियंत्रक प्रोटोटाइप बीन का उपयोग करता है तो इस सिंगलटन नियंत्रक के प्रारंभ के दौरान इसके आश्रित प्रोटोटाइप बीन भी बनाए जाएंगे। इसलिए सभी अनुरोध एकल बीन तक पहुंच जाएंगे। कृपया मुझे प्रबुद्ध करें। – beinghuman

0

आप अपनी सेवा इंजेक्षन चाहिए, वसंत का उपयोग कर अपने नियंत्रकों के दाव वस्तुओं और वसंत के माध्यम से इंजेक्शन सभी सेम डिफ़ॉल्ट

से एकमात्र
+0

कृपया एक बार फिर से मेरे प्रश्न से गुज़रें। इस तरह के उत्तर की उम्मीद नहीं है। क्या मेरा प्रश्न अस्पष्ट है? कृपया मुझे – beinghuman

+0

बताएं हम आम तौर पर प्रत्येक अनुरोध के लिए सेवा और दाओ ऑब्जेक्ट्स नहीं बनाते हैं, न ही हमें थ्रेड पूल बनाने की आवश्यकता है इन ऑब्जेक्ट्स, हालांकि प्रत्येक अनुरोध के लिए इन दो ऑब्जेक्ट्स को तत्काल करने से प्रक्रिया को धीमा कर दिया जा सकता है, जब तक कि उनके पास इंस्टेंटाइट –

+0

पर बड़ी निर्भरता न हो, ठीक है, मुझे लगता है कि मुझे कुछ याद आया है। हर अनुरोध से मेरा मतलब है कि उन अनुरोधों को जिन्हें कुछ एक्सेस करने की आवश्यकता है डेटाबेस। ऐसी स्थिति के लिए निश्चित रूप से मैं सिंगलटन सेवा और डीएओ ऑब्जेक्ट का उपयोग नहीं कर सकता? – beinghuman

2

हैं जब तक आपकी DAOs दृष्टांत फ़ील्ड की जरूरत है, वहाँ कोई जरूरत उन्हें अनुरोध scoped होने के लिए है। जब तक आपके हाइबरनेट SessionSession#getCurrentSession() साथ लिया गया है, जो धागा बाध्य है, एक भी डीएओ उदाहरण सभी अनुरोधों को हैंडल करने ठीक है। सेवा कक्षाओं और नियंत्रकों के लिए भी यही लागू होता है।

अपने बयान

जो मैं

उपयोगकर्ता हमेशा सच नहीं है यही कारण है, कैसे भारी वस्तु है पर निर्भर करता है के जवाब नीचे धीमी गति से लगता है के रूप में। सर्वलेट कंटेनर और आपकी वसंत DispatcherServlet वैसे भी कई वस्तुओं को तुरंत चालू कर रहे हैं। आपको एक बड़ा बदलाव नहीं दिखना चाहिए।

इन वस्तुओं में से एक पूल बनाना overkill होगा। नोट: वे थ्रेड पूल नहीं होंगे, बस ऑब्जेक्ट पूल।

+0

मान लीजिए कि एकाधिक उपयोगकर्ता पंजीकरण करना चाहते हैं। मैं प्रत्येक उपयोगकर्ता के लिए एक पंजीकरण बीन (प्रोटोटाइप, अनुरोध, सत्र स्कॉप्ड) तैयार करूंगा.अब मैं पंजीकरण सेवा में इस बीन को पास कर रहा हूं (@transactional एनोटेशन के साथ एनोटेटेड)। यह सेवा प्राप्त पंजीकरण बीन पास करेगी डीएओ के लिए ऑब्जेक्ट। अगर सेवा और डीएओ हैं तो सिंगलटन एकाधिक उपयोगकर्ताओं के लिए अनुरोधों को मिश्रित नहीं किया जाएगा? – beinghuman

+0

@ निखिल: नहीं। सिंगलटन सेवाएं और दास डिफ़ॉल्ट हैं, और वे ठीक काम करते हैं, जब तक कि आपके पास किसी भी इंस्टेंस सदस्यों में किसी व्यक्तिगत अनुरोध के लिए कुछ भी विशिष्ट न हो। विधि-तर्क और स्थानीय चर में अनुरोध-विशिष्ट सामग्री रखें, और वसंत बाकी को संभालेगा। –

+0

@NathanHughes कृपया ओलाफ के जवाब में मेरी टिप्पणियों की जांच करें। क्या आप समझने में मेरी मदद कर सकते हैं? – beinghuman

3

@ सेवा और दाओ कक्षा के साथ @ सेवा भंडार के साथ अपनी सेवा कक्षा को एनोटेट करें।

<context:component-scan base-package="x.y.z.service, x.y.z.dao" /> 

यह स्वचालित रूप से अपनी कक्षा

0

मैं एक ही भ्रम की स्थिति के माध्यम से जा रहा हूँ हालांकि, के लिए सिंगलटन सेम बनाता है, सभी लिंक को पढ़ने के बाद। यह वही है जो मैंने समझा है (कृपया मुझे सही करें यदि मैं गलत हूं) पंजीकरण बीन प्रकार प्रोटोटाइप या अनुरोध का होगा क्योंकि पंजीकरण के लिए दो या दो से अधिक अनुरोध हो सकते हैं और यदि वह ऑब्जेक्ट सिंगलटन है तो ओवरराइटिंग होगी एक दूसरे के मूल्य।

डीएओ और सेवा सिंगलटन होगी क्योंकि वे केवल विधियां हैं और अन्य धागे द्वारा उपयोग किए जाने वाले किसी भी वैश्विक चर को संशोधित नहीं करते हैं। उनके पास अपना खुद का ढेर है।

+0

हां। या इसे थोड़ा अलग तरीके से रखने के लिए, किसी एकल सिंगलटन को बहु-थ्रेडेड संदर्भ में साझा नहीं किया जाना चाहिए- किसी भी आवृत्ति चर अंतिम, या कन्स्ट्रक्टर-लोड होने के द्वारा स्टेटलेस-स्टेटलेस होना चाहिए। – theRiley

संबंधित मुद्दे