为什么在Service层能不能注入Controller的Bean

面试官: 在我们使用ssm或者ssh框架的时候,我们通常可以在Controller层注入@Service,@Component,@Repository等Bean,那么我们能否在Service注入@Controller的Bean呢?

我: 什么玩意?在Service层注入Controller层的Bean?那不直接用@Autowired注解注入一下就行了吗?

没错,一般我们使用SpringBoot的时候可以注入并正常使用的,但是面试官说的是使用SpringMVC+Spring的时候,其实面试官考察的是我们对Spring容器和SpringMVC容器之间区别的理解。

解释: 我们知道,Spring和SpringMVC都会根据自己的配置文件去生成各自的容器,那Spring的叫做父容器,SpringMVC的叫做子容器。但是其主要区别在于:子容器可以访问父容器中的Bean,而父容器不能访问子容器中的Bean,所说我们可以在Controller中注入@Service,@Component,@Repository等Bean,但如果想要在Service中注入@Controller Bean是不可以的 ,因为父容器不能访问子容器中的Bean,实际我们也不会这样用。

面试官: 那他为什么要分两个容器来存放Bean呢,我使用Spring扫描全部的Bean有没有问题?

我: 当然有问题!如果我们使用Spring扫描所有的Bean,那说明所有的Bean都在父容器中,那SpringMVC会找不到Controller对象的,因为HandleMapping在找Controller时默认是不会去父容器中找的(HandleMapping处理器映射器)。如果你真的想把Controller的Bean存入父容器中,可以通过手动配置让它从父容器中找。但是这样会对HandlerMapping的配置不太好,约定大于配置嘛!(另外,如果所有Bean都在父容器中时,Controller的Bean是可以注入到Service的,因为两者都在Spring容器中)

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值