2013-08-30 50 views
8

Tôi đang tạo một ứng dụng web bằng cách sử dụng spring, hibernate. Giả sử nhiều người dùng muốn đăng ký. Tôi sẽ tạo một bean đăng ký (nguyên mẫu hoặc yêu cầu hoặc phiên scoped) và autowire nó trong Controller.Phạm vi điều khiển, dịch vụ, kho lưu trữ trong ứng dụng web mùa xuân?

Bây giờ tôi chuyển đậu này sang Dịch vụ đăng ký (chú thích bằng chú thích "@transactional") cũng được tự động điều khiển trong trình kiểm soát. Dịch vụ này sẽ vượt qua đối tượng đậu đăng ký nhận được để DAO (DAO này được tự động trong dịch vụ) Nếu dịch vụ và DAO là singelton sẽ không yêu cầu được trộn lẫn cho nhiều người dùng?

Đây là những gì tôi đã làm: Tôi đã tạo phạm vi dịch vụ và DAO là "yêu cầu". Đây có phải là phương pháp phù hợp không? hoặc những gì khác tôi có thể làm để làm cho dịch vụ và DAO singelton?

Logic của tôi đằng sau yêu cầu phạm vi: Lý do dịch vụ và DAO là yêu cầu phạm vi là nếu nhiều người dùng gọi registerationService.registerUser (bean); từ bộ điều khiển tại cùng một thời điểm và phạm vi là singelton sau đó sẽ không có coz nhất quán có một phương pháp của đối tượng được gọi với đầu vào khác nhau.

LET ME BIẾT WHERE TÔI ĐÃ SAO.

Registeration Bean

@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 


} 

khiển

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 



      } 



     } 

DAO:

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(); 
    } 
} 

bê tông DAO

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


} 

Trả lời

2

Dịch vụ và DAO phải là trạng thái vô quốc tịch. Điều này sẽ cho phép bạn cấu hình chúng như là Spring singletons. Tôi hy vọng đây là những gì bạn có nghĩa là khi bạn nói "singleton".

Tất cả các mối quan tâm về luồng, bao gồm gộp nhóm, sẽ được quản lý bởi cơ sở hạ tầng: máy chủ web/Java EE và Spring DI của bạn.

+0

Giả sử nhiều người dùng muốn đăng ký. Tôi sẽ tạo một bean đăng ký (nguyên mẫu, yêu cầu, phiên scoped) cho mỗi người dùng. Bây giờ tôi chuyển đậu này sang Dịch vụ Đăng ký (chú thích bằng chú thích "@transactional"). đăng ký đậu đối tượng để DAO.Nếu dịch vụ và DAO là singelton would'nt các yêu cầu được trộn lẫn cho nhiều người dùng? – beinghuman

+0

Điều này không nên xảy ra trừ khi bạn đang cố gắng tự quản lý các phiên Hibernate trong DAO. Spring sẽ phân bổ một bối cảnh giao dịch, bao gồm cả phiên Hibernate, cho mỗi luồng. Các máy chủ web sẽ phân bổ một chủ đề/lấy một chủ đề từ hồ bơi cho mỗi yêu cầu của mỗi người dùng. Vì vậy, các bean đăng ký từ hai người dùng sẽ "sống" trong các vị trí bộ nhớ riêng biệt và sẽ được xử lý thông qua các phiên Hibernate riêng biệt và được ghi vào cơ sở dữ liệu trong các giao dịch riêng biệt trên các kết nối DB riêng biệt. – Olaf

+0

Điều này sẽ nhận được rõ ràng nếu tôi bạn có thể giải thích cho tôi this.Multiple yêu cầu đến.Web server phân bổ thread riêng biệt cho mỗi request.these đề sử dụng cùng một điều khiển singleton có nguyên mẫu registerbean? Làm thế nào mỗi thread sẽ nhận được mô hình riêng biệt đậu coz tôi đã thấy rằng nếu bộ điều khiển singelton sử dụng bean nguyên mẫu thì trong quá trình khởi tạo bộ điều khiển singelton, nó sẽ được tạo ra. Tất cả các yêu cầu sẽ truy cập vào bean đơn. Xin vui lòng khai sáng cho tôi. – beinghuman

0

bạn nên tiêm dịch vụ của bạn, các đối tượng dao vào bộ điều khiển của bạn bằng cách sử dụng lò xo và tất cả các hạt được tiêm vào mùa xuân là các bộ đơn theo mặc định

+0

xin vui lòng xem lại câu hỏi của tôi một lần nữa.Không mong đợi câu trả lời như vậy.Đó là câu hỏi của tôi không rõ ràng? Xin vui lòng cho tôi biết – beinghuman

+0

chúng tôi không thường tạo ra các dịch vụ và các đối tượng dao cho mọi yêu cầu. các đối tượng này, mặc dù instantiating hai đối tượng cho mỗi yêu cầu sẽ không làm chậm quá trình đến mức độ đo lường nhiều, trừ khi họ tự có phụ thuộc lớn để instantaite –

+0

okay tôi nghĩ rằng tôi đã bỏ lỡ something.by mọi yêu cầu tôi có nghĩa là những yêu cầu mà cần phải truy cập một cái gì đó từ database.For tình hình như vậy chắc chắn tôi không thể sử dụng dịch vụ singelton và đối tượng DAO? – beinghuman

2

Trừ khi DAO của bạn cần trường mẫu, không cần chúng yêu cầu phạm vi. Miễn là Hibernate Session của bạn được truy xuất với Session#getCurrentSession(), đó là chủ đề ràng buộc, một trường hợp DAO duy nhất để xử lý tất cả các yêu cầu là tốt. Điều tương tự cũng áp dụng cho các lớp dịch vụ và bộ điều khiển.

Đối với tuyên bố của bạn

mà tôi nghĩ làm chậm phản ứng cho người sử dụng

Đó không phải là luôn luôn đúng, tùy thuộc vào cách nặng đối tượng là. Thùng chứa Servlet và Spring DispatcherServlet của bạn đang khởi tạo rất nhiều đối tượng. Bạn không nên thấy một sự thay đổi lớn.

Tạo một nhóm các đối tượng này sẽ quá mức cần thiết. Lưu ý: Đó sẽ không phải là Hồ bơi chủ đề, chỉ là các hồ bơi đối tượng.

+0

Giả sử nhiều người dùng muốn đăng ký. Tôi sẽ tạo một bean đăng ký (nguyên mẫu, yêu cầu, phiên scoped) cho mỗi người dùng. Bây giờ tôi chuyển bean này sang Dịch vụ Đăng ký (được chú thích bằng chú thích @transactional). đối tượng để DAO.If dịch vụ và DAO là singelton would'nt các yêu cầu được trộn lẫn cho nhiều người dùng? – beinghuman

+0

@Nikhil: Không có dịch vụ singleton và daos là mặc định, và chúng hoạt động tốt, miễn là bạn không có bất cứ điều gì cụ thể cho một yêu cầu riêng lẻ trong bất kỳ thành viên cá thể nào. Giữ các công cụ yêu cầu cụ thể trong các đối số phương thức và các biến cục bộ, và Spring sẽ xử lý phần còn lại. –

+0

@NathanHughes Vui lòng kiểm tra ý kiến ​​của tôi trong câu trả lời của Olaf.Bạn có thể giúp tôi hiểu không? – beinghuman

3

Chú thích lớp dịch vụ của bạn với lớp @Service và Dao với @Repository.

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

nó sẽ tự động tạo ra đậu singleton cho lớp học của bạn

0

Tôi đang trải qua sự nhầm lẫn tương tự, tuy nhiên, sau khi đọc tất cả các liên kết. Đây là những gì tôi đã hiểu (Vui lòng sửa tôi Nếu tôi sai) Đậu đăng ký sẽ là mẫu thử nghiệm hoặc yêu cầu vì có thể có hai hoặc nhiều yêu cầu đồng thời đăng ký và nếu đối tượng đó là singleton thì sẽ ghi đè giá trị của nhau.

DAO và dịch vụ sẽ được singleton vì chúng chỉ là phương pháp và không sửa đổi bất kỳ biến toàn cầu nào được sử dụng bởi các luồng khác. Họ có ngăn xếp của riêng họ.

+0

Có. Hoặc để đặt nó hơi khác một chút, bất kỳ singleton nào được chia sẻ không bị thay đổi trong bối cảnh đa luồng phải được đặt hàng-stateless bằng cách có bất kỳ biến mẫu cuối cùng nào hoặc hàm dựng được tải. – theRiley