由于没有实现单例或者说再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 出来的,最后我将赋值的对象改为同一个对象,最后成功了。