Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringWeb应用程序中控制器、服务和存储库的范围?_Java_Multithreading_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java SpringWeb应用程序中控制器、服务和存储库的范围?

Java SpringWeb应用程序中控制器、服务和存储库的范围?,java,multithreading,spring,hibernate,spring-mvc,Java,Multithreading,Spring,Hibernate,Spring Mvc,我正在使用spring、hibernate创建一个web应用程序。 假设有多个用户想要注册,我将创建一个注册bean(原型、请求或会话范围),并在控制器中自动连接它 现在我将这个bean传递给注册服务(用“@transactional”注释进行注释),该服务也在控制器中自动连接。 此服务将接收到的注册bean对象传递给DAO(此DAO在服务中自动连接),如果服务和DAO是单一的,那么多个用户的请求不会混淆吗 以下是我所做的:我创建了服务范围和DAO作为“请求”。 这是正确的方法吗?或者我还能做些

我正在使用spring、hibernate创建一个web应用程序。
假设有多个用户想要注册,我将创建一个注册bean(原型、请求或会话范围),并在控制器中自动连接它

现在我将这个bean传递给注册服务(用“@transactional”注释进行注释),该服务也在控制器中自动连接。 此服务将接收到的注册bean对象传递给DAO(此DAO在服务中自动连接),如果服务和DAO是单一的,那么多个用户的请求不会混淆吗

以下是我所做的:我创建了服务范围和DAO作为“请求”。 这是正确的方法吗?或者我还能做些什么来提供服务和DAO singelton

我请求背后的逻辑范围如下: 将服务和DAO作为请求作用域的原因是如果多个用户调用 registerationService.registerUser(bean);同时从控制器开始,作用域为Singleton,则不存在一致性,因为一个对象的方法使用不同的输入调用

让我知道我错在哪里

注册豆

@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



            }



        }
道:

公共抽象类AbstractHibernateDAO{
公共类clazz;//类对象引用
受保护的SessionFactory mysessionFactory;
@自动连线
public void setMysessionFactory(SessionFactory mysessionFactory){
this.mysessionFactory=mysessionFactory;
}
public T findOneByName(最终字符串名){
return(T)getCurrentSession().createQuery(“from”+clazz.getName()).uniqueResult();
}
公共无效集合(最终类别集合){
this.clazz=clazzToSet;
}
公共T findOne(最终长id){
return(T)getCurrentSession().get(clazz,id);
}
@抑制警告(“未选中”)
公共列表findAll(){
返回getCurrentSession().createQuery(“from”+clazz.getName()).list();
}
公共作废保存(最终T实体){
getCurrentSession().merge(实体);
}
公共作废更新(最终T实体){
getCurrentSession().update(实体);
}
公共作废删除(最终T实体){
getCurrentSession().delete(实体);
}
public void deleteById(最终长实体ID){
最终T实体=最终完成(实体ID);
删除(实体);
}
受保护的会话getCurrentSession(){
返回mysessionFactory.getCurrentSession();
}
}
混凝土刀

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


}
@存储库
@范围(proxyMode=ScopedProxyMode.TARGET\u类,value=“request”)
公共类UserDAO扩展了AbstractHibernateDAO{
}

您应该使用spring将您的服务、dao对象注入控制器,并且通过spring注入的所有bean默认情况下都是单例的

除非您的dao需要实例字段,否则不需要对它们进行请求范围限定。只要您的Hibernate
会话
是通过线程绑定的
会话#getCurrentSession()
检索的,一个DAO实例来处理所有请求就可以了。这同样适用于服务类和控制器

至于你的声明

我认为这会减慢对用户的响应

这并不总是正确的,这取决于物体的重量。Servlet容器和Spring
DispatcherServlet
正在实例化这么多对象。你不应该看到大的变化


创建一个由这些对象组成的池将是过分的。注意:那些不是线程池,只是对象池。

服务和DAO应该是无状态的。这将允许您将它们配置为Spring单例。我希望这就是你说“单身”的意思


所有线程问题,包括线程池,都将由基础设施来处理:您的web/Java EE服务器和Spring DI。

用@service注释您的服务类,用@Repository注释Dao类

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


它会自动为您的类创建单例bean

但是,在阅读了所有链接之后,我遇到了同样的困惑。 这就是我所理解的(如果我错了,请纠正我) 注册bean将是prototype或request类型,因为可以同时有两个或多个注册请求,如果该对象是singleton,那么将覆盖彼此的值


DAO和服务将是单例的,因为它们只是方法,不修改任何将由其他线程使用的全局变量。他们有自己的堆栈。

请再次检查我的问题。我不希望得到这样的答案。我的问题不清楚吗?请告诉我我们通常不会为每个请求创建服务和dao对象,也不需要创建这些对象的线程池,尽管为每个请求实例化这两个对象不会在很大程度上降低流程速度,除非它们本身对Instantaite有很大的依赖关系,好吧,我想我错过了一些东西。我所说的每个请求都是指那些需要从数据库访问某些内容的请求。对于这种情况,我绝对不能使用singelton服务和DAO对象?假设多个用户想要注册。我将为每个用户创建一个注册bean(原型、请求、会话范围)。现在我将这个bean传递给注册服务(用@transactional annotation注释)。此服务将接收到的注册bean对象传递给DAO。如果服务和DAO是单一的,那么多个用户的请求不会混淆吗?@Nikhil:不会。单一服务和DAO是默认的,只要在任何实例成员中没有任何特定于单个请求的内容,它们就可以正常工作。将特定于请求的内容保留在方法参数和局部变量中,Spring将处理其余内容。@NathanHughes请检查我在Olaf答案中的注释。您能帮助我理解吗?@NikhilArora您传递的注册bean是请求范围的,即
<context:component-scan base-package="x.y.z.service, x.y.z.dao" />