热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自己写了一个简单的MVC框架,想整合Spring,需要做什么呢?

我自己基于HttpServlet实现了一个简单的MVC框架,大体的思路是在Servlet的init时将扫描到的带有注解的控制器和方法放到一个容器中,在请求过来时解析,通过

我自己基于HttpServlet实现了一个简单的MVC框架,大体的思路是在Servlet的init时将扫描到的
带有注解的控制器和方法放到一个容器中,在请求过来时解析,通过反射调用具体的控制器类的方法。
(请您不要笑话,可能我实现的比较简陋,我还是一名在校生)
在我实现了之后,想按照往常一样将Service和DAO通过Spring注入,我尝试在web.xml文件中加入
ContextLoaderListener和context-param

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


    org.springframework.web.context.ContextLoaderListener







    contextConfigLocation

    /WEB-INF/classes/applicationContext.xml



   



    simvc

    com.nekolr.simvc.servlet.SimDispatcherServlet

   

   

        base-package

        com.nekolr.ztree.controller

   








    simvc

    *.do


没有报错,但是在debug时看到,所有的注入都失败了(null),我在想是不是我自己实现的MVC框架需要在init时做一些事情,但是又不知道该做什么,等了好久了,哪怕指引一个方向也好,谢谢各位!


经提示,使用了手工注入的方式:

1
2
3
4
5
6
7
8
9






   







   


但是还是失败了(null)

继续尝试,在框架的入口Servlet的init方法里手工获取bean:

1
2
3
ApplicationContext cOntext= new ClassPathXmlApplicationContext("applicationContext.xml");

Object ztreeService = context.getBean("ztreeService");

System.out.println(ztreeService);

打印成功,为什么在这里就可以获取到,而注入反而不行呢?

感谢 @alexnevsky 大大的回答,让我有了一个折中的方法:

实现ApplicationContextAware接口,创建一个工具类,用来获取bean

1
2
3
4
5
6
7
8
9
10
11
12
13
public class AppUtil implements ApplicationContextAware {



    private static ApplicationContext context;



    @Override

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        cOntext= applicationContext;

    }



    public static Object getBean(String id){

        return context.getBean(id);

    }

}

业务代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Controller

@RequestMapping(value = "/ztree")

public class ZtreeController {

    private ZtreeService ztreeService = (ZtreeService) AppUtil.getBean("ztreeService");



    @RequestMapping(value = "/index.do", method = RequestMethod.GET)

    public String index(){

        return "index";

    }



    @RequestMapping(value = "/getData.do", method = RequestMethod.GET)

    @ResponseBody

    public List getData(){

        List list = ztreeService.getAll();

        for(Iterator iterator = list.iterator();iterator.hasNext();){

            ZtreeNode node = iterator.next();

            if(node.getParentid().equals(0L)){

                node.setParent(true);

            }else{

                node.setParent(false);

            }

        }

        return list;

    }

}

但是感觉好别扭啊。。

经过 @bugzy 大大的提醒,我明白了注入失败的原因:

我的Controller实例并不是放在Spring容器当中的(Spring应该是在创建Controller实例时将Service注入了,连同DAO,同时要考虑注入顺序)。在MVC框架中,我通过反射来创建Controller的实例,这和通过Spring获取有本质区别。但是框架本身的实现如此,我认为一种方式就是我上面使用的,在Controller里手动获取Service,另一种方式就是想办法在反射创建Controller时,将需要注入的对象注入,但是目测不好处理。


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
author-avatar
carefulff
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有