记录手写一次ssm框架遇到的一些坑之注入失败

由于没有实现单例或者说再contrllerMap和iocMap中实现同一个类两个对象,导致仅仅注入其中一个对象的坑

简介

  • 最近一直在尝试实现一个自己的ssm框架,前断时间已经分别实现了mvc 和 mybatis,其中在实现mvc的时候没有实现autowired注解,在整合ssm框架的时候开始实现,但是却碰上了问题(最近有时间的话,我会分别为之前实现的mvc和mybatis分别写一个框架的,这次也不全部分享源码,等有空全部实现后再分享上来)

文件目录结构

在这里插入图片描述

出现的问题

  • 在下图中的controller中,我进行注入一个service,但是在请求链接的时候,调用的方法中调用了userServiceImpl,但是提示userServiceImpl为空
  • 在这里插入图片描述
  • 我到MyDispatcherServlet类中查看我实现ioc的代码
 private void doIoc(){
    	if(ioc.isEmpty()) return ;
    	for(Entry<String, Object> entry : ioc.entrySet()){
    		Field[] fields = entry.getValue().getClass().getDeclaredFields();
    		for(Field field : fields){
    			 field.setAccessible(true);
    			if(field.isAnnotationPresent(MyAutowired.class)){
    				String autowiredValueName = field.getAnnotation(MyAutowired.class).value();
    				if(autowiredValueName == null || autowiredValueName.equals("")){
    					autowiredValueName = toLowerFirstWord(field.getType().getSimpleName());
    				}
    				field.setAccessible(true);
    				try {
    					field.set(entry.getValue(), ioc.get(autowiredValueName));
    					
					} catch (IllegalArgumentException e) {
						// TODO: handle exception
						e.printStackTrace();
					}catch (IllegalAccessException  e) {
						// TODO: handle exception
						e.printStackTrace();
					}
    			}
    		}
    		
    	}
    	
    }
 

  • 经过一系列各种判断,我确认我应该已经将userServiceImpl对象赋予了ioc容器中相应对象值了
    经过一系列检查发现,当时候实现mvc的时候服务controllerMap的对象和iocMap中的对象不是同一个对象,都是newInstance 出来的,最后我将赋值的对象改为同一个对象,最后成功了。

猜你喜欢

转载自blog.csdn.net/BeamCSDN/article/details/84442248