sessionattribute 被spring 扫描不到_Spring 随笔(一)

86c057efd9116fff326f6a210371625d.png

bean都是保存在容器中的,所以我们首先需要有容器,

实际上是通过一个叫ContextLoaderListener的监听器来完成这个操作的,具体可以看这篇文章:

反正我手长:JavaWeb技术(9):Listener​zhuanlan.zhihu.com
b1d8d26deb2526ade84eb947b4a55ead.png

加载完容器后:

c3be5bfc8e0f50bd719501bf78d04a73.png

我们发现容器里面已经有我们用户配置bean的bean.xml了:

37bf2bfb377b325dc0718283b75552b9.png

但是getBean的时候报了错,让我们在用容器获取bean之前初始化一个叫BeanFactory的东西:

e678ca93de29d73ee058d54205295dbf.png

并且直接明说让我们调用refresh方法:

e35cbcc3f9c16cd3e89295734e551b0d.png

接下就一步步step over,直到wac.getBean("dataSource")有值:

16c6159872b2f4324d748ab6da2cc685.png

invokeBeanFactoryPostProcessors的功劳:帮我们实例化并调用了所有的BeanFactoryPostProcessor bean,

但我们发现,一直到所有bean创建初始化成功,开始发布事件了,我还是没能get到Controller:

9db4663b7ae621989bb93c30b643566b.png

而且BeanDefine里面也没有Controller的信息,

其实是因为Controller扫描包的操作是配置在spring-mvc.xml中的,而spring-mvc.xml是配置在DispatcherServlet中的:

	<servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation不是必须的 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

注意这个时候,程序的debug还卡在ContextLoaderListener呢,肯定就找不到Controller啊,

现在我把扫描包的操作放到spring-xml中来验证我的猜想:

<context:component-scan base-package="top.wangruns.trackstacking.controller" />

dd13b910dd7444feb9210d1e78074d33.png

BeanDefine的数量比刚才多了15个,正好是我Controller的数量,

但我们发现还是getBean不到Controller,

我们接着往下debug,看到有个方法,他的作用是初始化剩下的没被初始化的勤快加载的单例:

4aabc9ffc15e2c87588bc53aa1fed023.png

c6d2b91a5b550cb35fcffd32a92769a9.png

初始化成功:

fdc1657976f4f7be79e676d673b825ca.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值