1

我有一个遗留应用程序,它对所有服务使用单例模式,并通过使用其他服务的服务内部和 Web 层中的 ServiceName.getInstance() 访问所有服务。我正在将项目转换为使用 Spring,并且正在考虑使用 getServiceA、getServiceB..etc 方法创建一个单例实用程序类 ServiceProvider,并让它从 Spring 应用程序上下文中获取 bean。我将仅在 Web 层中使用 ServiceProvider,因为我还不能将其转换为使用 Spring 并自动装配使用其他服务的所有服务。这是一个好的解决方案吗?

我有一个非常简单的 web 层,也许有人可以推荐如何以最小的更改使其弹性化。我有一个在启动时加载的控制器的 url 映射。RequestDispatcher 解析请求 url,按类查找控制器并执行模板方法(基本控制器有各种子类,但不会使问题复杂化)。

请求调度程序:

protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {


        int slashIndex = req.getRequestURL().lastIndexOf("/");
        String path = req.getRequestURL().substring(slashIndex, req.getRequestURL().length());


        ServiceURL url = urlMap.get(path);

        ServiceProvider.getLog().info("Requested page: " + path);
        if (url != null) {

            try {
                Utils.authenticate(req, resp);
                grantAccess(req, url);
                BaseServlet servlet = (BaseServlet)url.getClass().getClassLoader().loadClass(url.getClassName()).newInstance();

                servlet.service(req, resp);
            } 
            catch (AuthorizationException e) {

                resp.getWriter().write(new ErrorModel("You are not authorized to perform the requested action.").getContent());
                ServiceProvider.getAuthLog().info("auth", e);
            }catch (SystemException e) {

我正在考虑将我的 servlet 注释为组件,自动扫描包。ApplicationContext 可以通过完整的类名获取 bean 吗?

4

2 回答 2

2

看起来您的服务是无状态的。我会用@Service 注释它们(使它们成为spring bean),然后在你需要的任何地方使用@Autowire。让 Spring 充当服务提供者。

于 2013-05-16T16:27:53.357 回答
0

您的 getInstance() 解决方案听起来像是对象不受 Spring 的控制。

如果您需要以 JNDI 查找的形式访问服务,您应该在 Spring 中对其进行配置。

如果它在 Spring 的控制之下,则不应在您的代码中对其进行实例化。如果它在你的代码中被实例化,它就不受 Spring 的控制。

于 2013-05-16T17:10:54.267 回答