在Spring 3.1中使用beans:profiles之后@Autowired bean未加载


问题内容

beans:profiles在我的xml中使用了这样的代码:

    <beans profile="dev">
        <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.internal.url}" />
            <property name="username" value="${jdbc.internal.username}" />
        </bean>
   </beans>

我已经spring.active.profiles在web.xml中设置了:

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/myapp-servlet.xml</param-value>
    </init-param>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </init-param>
</servlet>

我的代码结构是这样的:

//controller
@Controller 
public class MyController {
  @Autowired
  private MyService myService;
  ....
}

//service implementation
@Service("myservice")
public class MyServiceImpl implements MyService {
  @Autowired
  DBService dbService;
}

//db service
@Service("dbservice)
public class DBServiceImpl implements DbService {
  @Autowired
  public void setDataSource (Datasource ds) { 
    this.jdbcTemplate = new JdbcTemplate(ds);
  }
}

错误:

创建名称为“
myController”的bean时出错:自动连接的依赖项注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private
MyService MyController.myService;
嵌套的异常是org.springframework.beans.factory.BeanCreationException:

嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为’dbService’的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配方法:public
void DBServiceImpl.setDataSource(javax.sql.DataSource);
嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[javax.sql.DataSource]的匹配bean作为依赖项:至少应有1个可以作为该依赖项的自动装配候选的bean。依赖项注释:{}在org.springframework.beans.factory.support的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)处。


问题答案:

我猜您在DispatcherServlet上下文中使用配置文件,而DataSource可能位于根应用程序上下文中。

更新
:尝试使用上下文参数(从此处获取):

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>