热门标签 | 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时,将需要注入的对象注入,但是目测不好处理。


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
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社区 版权所有