关于spring使用的一些个人记录(这是标题?????)

关于spring的一些小问题(自动注入mapper为null与servlet不可自动注入service)

今天学习了springmvc,其中有用到mapper的自动装配,但是却一直报空指针异常,最初怀疑是没有加载配置文件,便配置了***

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>

这之后问题依然没有解决,以为还是没有加载,但是在使用了ApplicationContextAware接口得到了初始化的ApplicationContext对象后,确定在初始化时配置文件是加载了的,但是为何mapper还是没有注入呢?
之后添加了
@Resource
public void setTicketMapper(TicketMapper ticketMapper) {
this.ticketMapper = ticketMapper;
System.out.println(“調用了”);
System.out.println(ticketMapper + “;” + this.ticketMapper);
}

以检测是否进行了注入,发现当服务器启动时并没有输出任何东西,由此发现我的配置文件中并没有配置扫描器
context:annotation-config</context:annotation-config>
<context:component-scan base-package=“service”></context:component-scan>

或者手动配置bean,于是我改正了这个错误,终于,在web启动时,输出了这两句
調用了
org.apache.ibatis.binding.MapperProxy@22608608;;;org.apache.ibatis.binding.MapperProxy@22608608

but很遗憾…mapper依然为null,诶?属性明明已被赋值为何调用依然是null?由此我怀疑我在表示层调用的并不是初始化的这个service,一瞅,果然,我用的是一个自己new 出来的service而不是初始化时容器中被注入了mapper的service,于是果断上手,给表示层类中的service属性美滋滋的加上注解
@Resource
private TicketService ticketService;

接下来便是见证奇迹的时刻,服务器启动,访问servlet
严重: Allocate exception for servlet [ui.ListTickets]
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:96)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.apache.naming.NamingContext.lookup(NamingContext.java:840)
at org.apache.naming.NamingContext.lookup(NamingContext.java:159)
at org.apache.naming.NamingContext.lookup(NamingContext.java:827)
at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:584)…以下省略几十行emmmm

?????黑人问号,什么鬼我去,无法创建实例?这时才想起来当时为嘛不用自动注入,原来是会报错,经过一番百度只有解决办法就是new一个却没有原因,经过半天的脑内斗争,隐约想起servlet默认是在第一次被访问才会创建,但是spring的注入确是在服务器启动时便进行的,由此,问题解决,将service层的mapper属性设为静态以便初始化后共享给自己new出来的service即可

总结:原因就是当时未学习springmvc便急于整合,以至于使用servlet导致不能在初始化时便自动装配好所有的bean,表示层用的service时第一次访问时才new出来的而不是初始化时被注入了mapper的,记录下这个错误以便日后温习(毕竟折腾了一下午到现在晚上10点半…)

全部评论
所以我当时写这个我自己都看不懂了……
点赞 回复 分享
发布于 2021-10-26 22:38

相关推荐

04-09 21:07
门头沟学院 Java
a了几道
明天也要十一点半之前起床:最恶心的一集。各个都会做,各个都做不对,乍一看开心坏了以为自己能 ak,结果是春招以来做得最垃圾的一次。第二题测试数据里面 k 为什么有 0,直接全错;第三题感觉自己啥情况都考虑了但是只有 60%。
投递拼多多集团-PDD等公司10个岗位 >
点赞 评论 收藏
分享
Yki_:以下条件优先录用: 喜欢去缅北当猪仔的
点赞 评论 收藏
分享
02-26 15:33
已编辑
西北大学 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务