2015-04-24 5 views
1

Я просмотрел следующую страницу, чтобы загрузить приложение Context.xml в Java.Весной прототип bean reference в Spring @Configuration

http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06.html

Мои ApplicationContext есть что-то вроде:

<beans> 
    <bean id="foo" class="com.mypackage.Foo" scope="prototype">  
    </bean> 
</beans> 

мне нужно сослаться на "Foo" в Java следующим образом:

@Configuration 
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml") 
public class Config { 

    @Autowired Foo foo; 

    @Bean(name="fooRepository") 
    @Scope("prototype") 
    public FooRepository fooRepository() { 
     return new JdbcFooRepository(foo); 
    } 


} 

я создаю ссылку на FooRepository как следует:

ApplicationContext ctx = 
        new AnnotationConfigApplicationContext(Config.class); 

FooRepository fr = ctx.getBean("fooRepository", FooRepository.class); 

Каждый раз, когда я вызываю его, я получаю новый экземпляр FooRepository, который определяется как «прототип», и это хорошо со мной.

Но когда экземпляр FooRepository возвращается, я вижу, что тот же самый экземпляр «foo» используется, хотя «foo» в XML-файле является «прототипом».

  1. Как установить Foo как новый экземпляр все время FooRepository при создании FooRepository?
  2. Экземпляр Foo должен быть из файла XML.
+0

Почему foo аннотируется «** прототипом **» вместо «прототипа»? http://www.tutorialspoint.com/spring/spring_bean_scopes.htm И можете ли вы предоставить себе Фу? это аннотируется с чем-то вроде Компонента? – Zarathustra

+0

Я хотел использовать для этого полужирный шрифт. На самом деле это просто «прототип». Я редактирую его сейчас ... – serverfaces

ответ

1

Вы должны удалить запись из Foo из XML. Вы можете определить его таким образом.

@Configuration 
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml") 
public class Config { 

    @Bean(name = "fooRepository") 
    @Scope("prototype") 
    public FooRepository fooRepository() { 
     return new JdbcFooRepository(foo()); 
    } 

    @Bean(name = "foo") 
    @Scope("prototype") 
    public Foo foo() { 
     return new foo(); 
    } 
} 

подход 2: Вы можете передать этот SO Answer.

@Configuration 
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml") 
public class Config { 

    @Autowired 
    private ApplicationContext context; 

    @Bean(name = "fooRepository") 
    @Scope("prototype") 
    public FooRepository fooRepository() { 
     return new JdbcFooRepository(context.getBean("foo", Foo.class)); 
    } 
} 
+0

Предполагая, что у меня нет доступа к редактированию XML, все равно нужно обратиться к файлу XML, чтобы получить прототип Foo, есть ли способ? – serverfaces

+0

@serverfaces, я обновил свой ответ. –

+0

Я дам ему выстрел, используя подход № 2 завтра утром и дам вам знать. – serverfaces

-1

Первый подход:

Foo должен быть прототип, а также.

Второй подход:

@Configuration 
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml") 
public class Config { 

      @Bean(name = "fooRepository") 
      @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
      public FooRepository fooRepository(Foo foo) { 
       return new JdbcFooRepository(foo); 
      } 
} 
+0

Да, Foo - прототип. См. Представленный образец XML. – serverfaces

+0

Я обновил свой ответ, вы были правы. – Zarathustra

Смежные вопросы