为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2019-03-01 11:00:11
我自己基于HttpServlet实现了一个简单的MVC框架,大体的思路是在Servlet的init时将扫描到的 带有注解的控制器和方法放到一个容器中,在请求过来时解析,通过反射调用具体的控制器类的方法。(请您不要笑话,可能我实现的比较简陋,我还是一名在校生)在我实现了之后,想按照往常一样将Service和DAO通过Spring注入,我尝试在web.xml文件中加入ContextLoaderListener和context-param <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>simvc</servlet-name> <servlet-class>com.nekolr.simvc.servlet.SimDispatcherServlet</servlet-class> <!-- 这里是扫描的包 --> <init-param> <param-name>base-package</param-name> <param-value>com.nekolr.ztree.controller</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>simvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 没有报错,但是在debug时看到,所有的注入都失败了(null),我在想是不是我自己实现的MVC框架需要在init时做一些事情,但是又不知道该做什么,等了好久了,哪怕指引一个方向也好,谢谢各位! 经提示,使用了手工注入的方式: <bean id="ztreeDao" class="com.nekolr.ztree.dao.ZtreeDaoImpl"></bean> <bean id="ztreeService" class="com.nekolr.ztree.service.ZtreeServiceImpl"> <property name="ztreeDao" ref="ztreeDao"></property> </bean> <bean id="ztreeController" class="com.nekolr.ztree.controller.ZtreeController"> <property name="ztreeService" ref="ztreeService"></property> </bean> 但是还是失败了(null) 继续尝试,在框架的入口Servlet的init方法里手工获取bean: ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Object ztreeService = context.getBean("ztreeService"); System.out.println(ztreeService); 打印成功,为什么在这里就可以获取到,而注入反而不行呢? 感谢 @alexnevsky 大大的回答,让我有了一个折中的方法: 实现ApplicationContextAware接口,创建一个工具类,用来获取bean 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); } } 业务代码: @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<ZtreeNode> getData(){ List<ZtreeNode> list = ztreeService.getAll(); for(Iterator<ZtreeNode> 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时,将需要注入的对象注入,但是目测不好处理。
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

用spring就要在spring.xml中配置扫描包。servlet不是控制层吗?通过参数值反射类?

查看完整回答
反对 回复 2019-03-01
?
翻阅古今

TA贡献1780条经验 获得超5个赞

为什么没人回答呢,是我陈述的不清楚吗?

查看完整回答
反对 回复 2019-03-01
?
开满天机

TA贡献1786条经验 获得超13个赞

“带有注解的控制器和方法放到一个容器中”,我猜你大概自己实现了一个管理controller的容器,所以当然注入失败,你的controller必须放进spring的bean容器中。

首先,你的controller必须加入 spring 的 bean 容器;
然后,你可以稍加改造你的dispatcher,扫描到自己定义的访问路径以及类方法后,从spring容器中取出对象执行,不要用反射自己 newInstance.

Good Luck.

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 489 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信