8

春、休止状態を使用して Web アプリケーションを作成しています。複数のユーザーが登録したいとします。登録 Bean (プロトタイプまたはリクエストまたはセッション スコープ) を作成し、コントローラーで自動配線します。

ここで、この Bean を登録サービス ("@transactional" アノテーションが付けられている) に渡します。これもコントローラーで自動配線されます。このサービスは、受信した登録 Bean オブジェクトを DAO に渡します (この DAO はサービスで自動配線されます)。サービスと DAO がシングルトンの場合、複数のユーザーに対して要求が混同されませんか?

私が行ったことは次のとおりです。サービスの範囲とDAOを「リクエスト」として作成しました。これは正しいアプローチですか?または、サービスと DAO をシングルトンにするために他に何ができますか?

リクエストのスコープの背後にある私のロジック: サービスと DAO をリクエストのスコープとして作成する理由は、複数のユーザーが registerationService.registerUser(bean); を呼び出す場合です。コントローラーから同時に、スコープがシングルトンの場合、1つのオブジェクトのメソッドが異なる入力で呼び出されるため、一貫性がありません。

どこが間違っているか教えてください。

登録ビーン

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

具体的なDAO

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


}
4

5 に答える 5

3

サービス クラスに @Service でアノテーションを付け、Dao クラスに @Repository でアノテーションを付けます。

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

クラスのシングルトンBeanを自動的に作成します

于 2013-08-30T14:34:37.343 に答える
0

スプリングを使用してサービス、dao オブジェクトをコントローラーに注入する必要があり、スプリングを介して注入されたすべての Bean はデフォルトでシングルトンです

于 2013-08-30T13:25:19.120 に答える