【Bug】Spring 父容器不能访问子容器

先来看一段配置
web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring/applicationContext.xml</param-value>
</context-param>
<!--若无context-param则ContextLoaderListener默认加载WEB-INFO目录下的applicationContext.xml文件  -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--若无init-param则默认加载WEB-INFO目录下的xxx-servlet.xml(即此处默认加载springMVC-servlet.xml)文件   -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

spring-mvc.xml

<context:component-scan base-package="com.example.**.*" >
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.163.com" />
    <property name="port" value="465" />
    <property name="username" value="" />
    <property name="password" value="" />
    <property name="defaultEncoding" value="utf-8" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.ssl.enable">true</prop>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.timeout">25000</prop>
        </props>
    </property>
</bean>

applicationContext.xml

<context:component-scan base-package="com.example.services" />

基于上面这些配置信息,当我们在service内获取spring容器中的javaMailSender对象时出现NoSuchBeanDefinitionException

单元测试时正常,但正常调用时却发生异常。对比单元测试使用的配置文件,发现两处的文件是一致的。于是想到会不会是父子容器的问题。
spring-mvc.xml中关于javaMailSender的配置迁移到applicationContext.xml后,不再报错。

spring只允许子容器中的元素访问父容器中的元素,而不允许将此顺序反过来。

通过ContextLoaderListener加载的元素均保存在父容器中,而通过DispatcherServlet加载的元素则保存在子容器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值