@Service跟WebApplicationContext有什么区别?

今天在整spring,发现一个特别奇葩的问题。我通过@Service注解的bean,可以通过@Autowired自动注入,但是当我要用WebApplicationContextUtils从上下文中获取的时候,发现WebApplicationContext是空的,也就是说spring启动的时候是没有加载上下文的,那么@Autowired又是从哪里加载bean的呢?难道这里spring容器里面维护了2套?

1个回答

把你从上下文获取bean的代码贴一下。

weixin_36520502
weixin_36520502 回复辛幻柏: 懂了,谢谢!
大约 3 年之前 回复
wlz766107
辛幻柏 说错,是将注册的bean放入到WebApplicationContext,但如果不是Web应用,就当然不会放入到这其中了,这只是spring为Web应用的一种特有的实现方式。Web应用真正的实现类是 XmlWebApplicationContext,也是 WebApplicationContext的实现,不是Web就不是这样实现了,所以你才得到null。
大约 3 年之前 回复
wlz766107
辛幻柏 不是两套,是Web应用中spring的监听器会帮我们把bean工厂的引用放到WebApplicationContext中去,以便我们使用。
大约 3 年之前 回复
weixin_36520502
weixin_36520502 回复辛幻柏: 懂了,所以@Autowired注入的bean跟WebApplicationContext上下文其实是2套了
大约 3 年之前 回复
wlz766107
辛幻柏 回复weixin_36520502: 都说了,spring所注册的监听器会将所注册的bean放入 WebApplicationContext中,但是如果你没有设置监听器,spring bean也还是存在的,只是没有存储到WebApplicatonContext中,这时候就不能从其中取到bean了,你取要从ApplicationContext中获得。
大约 3 年之前 回复
weixin_36520502
weixin_36520502 不是启动web应用这句话怎么理解?我通过@Autowired可以正常注入service,难道不是一个web应用吗?虽然后来就我注册了一个监听器确实就可以获取到WebApplicationContext了, 但是没有注册监听器,也就是在没有spring上下文的情况下依然可以注入service,不是很奇怪吗?
大约 3 年之前 回复
wlz766107
辛幻柏 在Web的上下文初始化后,spring所注册的监听器会将所注册的bean放入 WebApplicationContext中,可能是你不是启动Web应用,所以才为null。所以你不应该从WebApplicationContext中取。
大约 3 年之前 回复
weixin_36520502
weixin_36520502 下班了,我手打吧。 BeanFactory beanFactory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext); LoginServiceRedis loginServiceRedis = (LoginServiceRedis)beanFactory.getBean("loginServiceRedis"); 我调试了源码,获取WebApplicationContext的时候是null,另,我没有配置web.xml
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问