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>{
}
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
Đ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
Đ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