Spring框架抽象

时间:2013-05-16 15:54:31

标签: java spring

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

我有一个非常简单的网络层,也许有人可以推荐如何以最小的变化来实现它。我有一个启动时加载的控制器的URL地图。 RequestDispatcher解析请求url,按类查找控制器并执行模板方法(基本控制器有各种子类,但不会使问题复杂化)。

的RequestDispatcher:

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吗?

2 个答案:

答案 0 :(得分:2)

看起来您的服务是无国籍的。 我会使用@Service(使它们成为spring bean)对它们进行注释,并在任何需要的地方@Autowire。让Spring充当服务提供商。

答案 1 :(得分:0)

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

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

如果它受Spring控制,则不应在代码中实例化。如果它在你的代码中被实例化,那么它不受Spring的控制。