public void evenCircularScansAreSupported() {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(LeftConfig.class); // left scans right, and right scans left
   ctx.refresh();
   ctx.getBean("leftConfig"); // but this is handled gracefully
   ctx.getBean("rightConfig"); // and beans from both packages are available
 }
 @Test
 public void withMultipleAnnotationIncludeFilters2() throws IOException, ClassNotFoundException {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComponentScanWithMultipleAnnotationIncludeFilters2.class);
   ctx.refresh();
   ctx.getBean(DefaultNamedComponent.class); // @CustomStereotype-annotated
   ctx.getBean(MessageBean.class); // @CustomComponent-annotated
 }
 @Test
 public void withScopeResolver() {
   AnnotationConfigApplicationContext ctx =
       new AnnotationConfigApplicationContext(ComponentScanWithScopeResolver.class);
   // custom scope annotation makes the bean prototype scoped. subsequent calls
   // to getBean should return distinct instances.
   assertThat(
       ctx.getBean(CustomScopeAnnotationBean.class),
       not(sameInstance(ctx.getBean(CustomScopeAnnotationBean.class))));
 }
  @Test
  public void recursion() {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(Level1Config.class);
    ctx.refresh();

    // assert that all levels have been detected
    ctx.getBean(Level1Config.class);
    ctx.getBean(Level2Config.class);
    ctx.getBean(Level3Component.class);

    // assert that enhancement is working
    assertThat(ctx.getBean("level1Bean"), sameInstance(ctx.getBean("level1Bean")));
    assertThat(ctx.getBean("level2Bean"), sameInstance(ctx.getBean("level2Bean")));
  }
 @Test
 public void withCustomTypeFilter() {
   AnnotationConfigApplicationContext ctx =
       new AnnotationConfigApplicationContext(ComponentScanWithCustomTypeFilter.class);
   CustomAnnotationAutowiredBean testBean = ctx.getBean(CustomAnnotationAutowiredBean.class);
   assertThat(testBean.getDependency(), notNullValue());
 }
 @Test
 public void viaContextRegistration_WithValueAttribute() {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComponentScanAnnotatedConfig_WithValueAttribute.class);
   ctx.refresh();
   ctx.getBean(ComponentScanAnnotatedConfig_WithValueAttribute.class);
   ctx.getBean(TestBean.class);
   assertThat(
       "config class bean not found",
       ctx.containsBeanDefinition("componentScanAnnotatedConfig_WithValueAttribute"),
       is(true));
   assertThat(
       "@ComponentScan annotated @Configuration class registered directly against "
           + "AnnotationConfigApplicationContext did not trigger component scanning as expected",
       ctx.containsBean("fooServiceImpl"),
       is(true));
 }
 @Test
 public void viaContextRegistration_WithLocallyDeclaredComposedAnnotation() {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComposedAnnotationConfig.class);
   ctx.refresh();
   ctx.getBean(ComposedAnnotationConfig.class);
   ctx.getBean(SimpleComponent.class);
   assertThat(
       "config class bean not found",
       ctx.containsBeanDefinition(
           "componentScanAnnotationIntegrationTests.ComposedAnnotationConfig"),
       is(true));
   assertThat(
       "@ComponentScan annotated @Configuration class registered directly against "
           + "AnnotationConfigApplicationContext did not trigger component scanning as expected",
       ctx.containsBean("simpleComponent"),
       is(true));
 }
 @Test
 public void withScopedProxyThroughAspectJPattern() throws IOException, ClassNotFoundException {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComponentScanWithScopedProxyThroughAspectJPattern.class);
   ctx.getBeanFactory().registerScope("myScope", new SimpleMapScope());
   ctx.refresh();
   // should cast to the interface
   FooService bean = (FooService) ctx.getBean("scopedProxyTestBean");
   // should be dynamic proxy
   assertThat(AopUtils.isJdkDynamicProxy(bean), is(true));
 }
 @Test
 public void withScopedProxy() throws IOException, ClassNotFoundException {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComponentScanWithScopedProxy.class);
   ctx.getBeanFactory().registerScope("myScope", new SimpleMapScope());
   ctx.refresh();
   // should cast to the interface
   FooService bean = (FooService) ctx.getBean("scopedProxyTestBean");
   // should be dynamic proxy
   assertThat(AopUtils.isJdkDynamicProxy(bean), is(true));
   // test serializability
   assertThat(bean.foo(1), equalTo("bar"));
   FooService deserialized = (FooService) SerializationTestUtils.serializeAndDeserialize(bean);
   assertThat(deserialized, notNullValue());
   assertThat(deserialized.foo(1), equalTo("bar"));
 }
 @Test
 public void viaContextRegistration_FromPackageOfConfigClass() {
   AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
   ctx.register(ComponentScanAnnotatedConfigWithImplicitBasePackage.class);
   ctx.refresh();
   ctx.getBean(ComponentScanAnnotatedConfigWithImplicitBasePackage.class);
   assertThat(
       "config class bean not found",
       ctx.containsBeanDefinition("componentScanAnnotatedConfigWithImplicitBasePackage"),
       is(true));
   assertThat(
       "@ComponentScan annotated @Configuration class registered directly against "
           + "AnnotationConfigApplicationContext did not trigger component scanning as expected",
       ctx.containsBean("scannedComponent"),
       is(true));
 }