Rahmen-Steuerungen ,Service,Repository im Frühling Web-Anwendung?
Ich bin erstellen einer web-Anwendung mit spring ,hibernate.
Angenommen, mehrere Benutzer registrieren möchte.Ich erstelle eine Registrierung bean(Prototyp-oder request-oder session-scoped) und autowire es in den Controller.
Leite ich nun diese Bohne zu Registration Service(kommentiert mit "@transactional" - Anmerkung), die auch autowired in den controler.
Dieser service wird pass erhielt registeration bean-Objekt von DAO(Das DAO ist autowired in den Dienst), Wenn service-und DAO sind singelton würde nicht die Anforderungen verwechselt werden, die für mehrere Benutzer?
Hier ist, was ich getan habe :ich habe den Umfang der service-und DAO-als "Anfrage".
Ist das der richtige Ansatz? oder was sonst könnte ich tun, um den service-und DAO-singelton?
Meiner Logik hinter request scoped:
Der Grund für das service-und DAO als request-scoped ist, wenn mehrere Benutzer Anruf
registerationService.registerUser(bean); von der Steuerung zur gleichen Zeit und Umfang ist singelton dann würde es keine Konsistenz, da es dort ein Objekt, dessen Methoden aufgerufen werden mit unterschiedlichen Eingaben.
LASSEN SIE MICH WISSEN, WO ICH FALSCH BIN.
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
}
Controller
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();
}
}
Konkrete DAO -
@Repository
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value="request")
public class UserDAO extends AbstractHibernateDAO<User_Details_Pojo>{
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Services und DAOs werden sollte, staatenlos. Dies würde ermöglichen es Ihnen zu konfigurieren, wie der Frühling singletons. Ich hoffe, dass dies ist, was Sie meinen, wenn Sie sagen, "singleton".
Alle threading-Bedenken, einschließlich der thread-pooling, wird gesorgt werden durch die Infrastruktur: Ihre web - /Java-EE-server und im Frühjahr DI.
Anmerkungen in Ihren service-Klasse mit der @ - Service-und Dao-Klasse mit der @Repository .
wird es automatisch erstellt singleton-bean für Ihre Klasse
Sei denn, Ihr DAOs benötigen Instanz-Felder, es gibt keine Notwendigkeit für Sie zu fordern, beschränkt. So lange, wie Sie Ihre Hibernate
Session
abgerufen werden mitSession#getCurrentSession()
, der thread gebunden sind, einen einzigen DAO-Instanz für die Behandlung aller Anfragen ist in Ordnung. Das gleiche gilt für die Service-Klassen und Controller.Wie für Ihre Aussage
Dass ist nicht immer wahr, je nachdem, wie schwer das Objekt ist. Der Servlet-container und Ihre Feder
DispatcherServlet
instanziieren so viele Objekte sowieso. Sie sollten nicht sehen, eine große Veränderung.Erstellen eines Pools von diesen Objekten wäre übertrieben. Hinweis: Diejenigen wäre, die nicht Thread-pools, nur Objekt-pools.
Registration
Instanz. Es werden keine concurrency-Probleme.sollten Sie injizieren Ihre service -, dao-Objekte, Controller mit spring und alle beans injiziert durch den Frühling sind singletons standardmäßig
Ich werde durch die gleiche Verwirrung, aber nach der Lektüre all die links.
Dies ist, was ich verstanden habe(Bitte korrigieren Sie mich, Wenn ich falsch Liege)
Die Registrierung bean-Typ-Prototyp oder-Anforderung, da kann es zwei oder mehr gleichzeitige Anforderungen für die Registrierung, und wenn das Objekt singleton-dann wird das überschreiben des jeweils anderen Wert.
DAO und service singleton denn Sie sind nur Methoden, und verändern Sie keine Globale variable verwendet werden, die von anderen threads. Sie haben Ihren eigenen stack.