title: Spring unable to pick Autowired implementation by profile
body: <p>I'm trying to figure out how to do mock implementations in Spring using the @Autowired annotation.  I'm trying to drive this by profiles in such a way that:</p>
  
  <ol>
  <li>There is a default profile which runs when no configuration is defined</li>
  <li>When the test profile is specified, it will Autowire mock objects instead of the default implementations.</li>
  </ol>
  
  <p>In pursuit of this setup, I'm running into a problem where Spring doesn't seem to be able to tell the difference between my implementations.  I'm using Tomcat/Jersey/Maven/Spring and I am not using any xml configuration.  Here is the run down of the relevant code (<a href="https://github.com/dkwestbr/autowired_example" rel="nofollow">viewable on my example GitHub</a>).</p>
  
  <p><strong>The problem</strong>: Running this by <code>mvn clean tomcat7:run</code> and navigating to '/foo/bar' produces the following exception (full stack trace below): <code>No qualifying bean of type [dkwestbr.spring.autowired.example.IStringGetter] is defined: expected single matching bean but found 2: a,b</code></p>
  
  <p>I realize that the problem is Spring cannot differentiate between my two implmentations, but I'm having trouble finding how to properly declare that I want a by default, and b only when running <code>mvn test</code>.</p>
  
  <p>My initializer:</p>
  
  <pre><code>    @Override
      public void onStartup(ServletContext context) throws ServletException {
          AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
          appContext.register(AppConfig.class);
  
          context.addListener(new ContextLoaderListener(appContext));
  
          /*
          for(String profile: appContext.getEnvironment().getActiveProfiles()) {
              System.out.println(String.format("Active profile: %s", profile));
          }
          */
  
          Map&lt;String, String&gt; filterParameters = new HashMap&lt;&gt;();
  
          // set filter parameters
          filterParameters.put("com.sun.jersey.config.property.packages", "dkwestbr.spring.autowired.example");
          filterParameters.put("com.sun.jersey.config.property.JSPTemplatesBasePath", "/WEB-INF/app");
          filterParameters.put("com.sun.jersey.config.property.WebPageContentRegex", "/(images|css|jsp)/.*");
  
  
          SpringServlet servlet = new SpringServlet();   
          ServletRegistration.Dynamic servletDispatcher = context.addServlet("jersey-servlet", servlet);
          servletDispatcher.setInitParameters(filterParameters);
          servletDispatcher.setLoadOnStartup(1);
          servletDispatcher.addMapping("/*");
      }
  </code></pre>
  
  <p>My Configuration:</p>
  
  <pre><code>@Configuration
  @ComponentScan(basePackages = {"dkwestbr.spring.autowired.example"})
  public class AppConfig {
  
      @Bean
      private static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
          return new PropertySourcesPlaceholderConfigurer();
      }
  
      @Configuration
      @PropertySource("classpath:configuration.properties")
      static class Production { }
  
      @Configuration
      @Profile("test")
      @PropertySource("classpath:configuration.properties")
      static class Test { }
  }
  </code></pre>
  
  <p>My web endpoint which has the <code>@Autowired</code> variable in question:</p>
  
  <pre><code>@Path("/foo")
  @Component
  public class WebEndpoint {
  
      @Autowired
      private IStringGetter getTheThing;
  
      @GET
      @Path("/bar")
      @Produces(MediaType.TEXT_HTML)
      public String getStuff() {
          System.out.println(getTheThing.getItGood());
          return String.format("&lt;html&gt;&lt;body&gt;Hello - %s&lt;/body&gt;&lt;/html&gt;", getTheThing.getItGood());
      }
  }
  </code></pre>
  
  <p>My first implementation (I want this to be default):</p>
  
  <pre><code>@Component
  public class A implements IStringGetter {
  
      @Value("${my.property}")
      private String configValue;
  
      @Override
      public String getItGood() {
          return String.format("I am an A: %s", configValue);
      }
  
  }
  </code></pre>
  
  <p>My second implementation (I only want this when running <code>mvn test</code>):</p>
  
  <pre><code>@Component
  @ActiveProfiles("test")
  public class B implements IStringGetter {
  
      @Value("${my.property}")
      private String configValue;
  
      @Override
      public String getItGood() {
          return String.format("I am an B: %s", configValue);
      }
  }
  </code></pre>
  
  <p>Full stack trace:</p>
  
  <pre><code>10:22:49.136 [localhost-startStop-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webEndpoint': Injection of autowired dependencies failed; nes
  ted exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dkwestbr.spring.autowired.example.IString
  Getter dkwestbr.spring.autowired.example.WebEndpoint.getTheThing; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionExcepti
  on: No qualifying bean of type [dkwestbr.spring.autowired.example.IStringGetter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostPro
  cessor.java:288) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116) ~[
  spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ~[s
  pring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) ~[spr
  ing-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) ~[spring-beans-3.2.4.RELEASE.jar:3
  .2.4.RELEASE]
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) ~[spring-beans-
  3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) ~[spring-beans-3.2.4.RELEASE.jar:3.2
  .4.RELEASE]
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4
  .RELEASE]
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628) ~[sprin
  g-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) ~[spri
  ng-context-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) ~[spring-context-3.2.4.RELEASE
  .jar:3.2.4.RELEASE]
          at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) ~[spring-web-3.2.4.RELEASE.
  jar:3.2.4.RELEASE]
          at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) [spring-web-3.2.4.RELEASE.jar:3.2.4.RELEAS
  E]
          at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [spring-web-3.2.4.RELEASE.jar:3.2
  .4.RELEASE]
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797) [tomcat-embed-core-7.0.37.jar:7.0.37]
          at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291) [tomcat-embed-core-7.0.37.jar:7.0.37]
          at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-7.0.37.jar:7.0.37]
          at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) [tomcat-embed-core-7.0.37.jar:7.0.37]
          at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) [tomcat-embed-core-7.0.37.jar:7.0.37]
          at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_40]
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_40]
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_40]
          at java.lang.Thread.run(Thread.java:724) [?:1.7.0_40]
  Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dkwestbr.spring.autowired.example.IStringGetter
   dkwestbr.spring.autowired.example.WebEndpoint.getTheThing; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No
   qualifying bean of type [dkwestbr.spring.autowired.example.IStringGetter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPost
  Processor.java:514) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RE
  LEASE]
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostPro
  cessor.java:285) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          ... 22 more
  Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [dkwestbr.spring.autowired.example.IStringGe
  tter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:865) ~[spring-bea
  ns-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770) ~[spring-beans
  -3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPost
  Processor.java:486) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RE
  LEASE]
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostPro
  cessor.java:285) ~[spring-beans-3.2.4.RELEASE.jar:3.2.4.RELEASE]
          ... 22 more
  Oct 11, 2013 10:22:49 AM org.apache.catalina.core.StandardContext listenerStart
  SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webEndpoint': Injection of autowired dependencies failed; nes
  ted exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dkwestbr.spring.autowired.example.IString
  Getter dkwestbr.spring.autowired.example.WebEndpoint.getTheThing; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionExcepti
  on: No qualifying bean of type [dkwestbr.spring.autowired.example.IStringGetter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostPro
  cessor.java:288)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
          at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
          at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
          at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
          at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
          at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
          at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
          at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
          at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
          at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
          at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
          at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
          at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
          at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
          at java.util.concurrent.FutureTask.run(FutureTask.java:262)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          at java.lang.Thread.run(Thread.java:724)
  Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dkwestbr.spring.autowired.example.IStringGetter
   dkwestbr.spring.autowired.example.WebEndpoint.getTheThing; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No
   qualifying bean of type [dkwestbr.spring.autowired.example.IStringGetter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPost
  Processor.java:514)
          at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostPro
  cessor.java:285)
          ... 22 more
  Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [dkwestbr.spring.autowired.example.IStringGe
  tter] is defined: expected single matching bean but found 2: a,b
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:865)
          at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)
          at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPost
  Processor.java:486)
          ... 24 more
  </code></pre>