2010-12-15 89 views
24
ApplicationContext ctx = new ClassPathXmlApplicationContext(
    "com/springinaction/springidol/spring-idol.xml"); 
Performer performer = (Performer) ctx.getBean("duke"); 
performer.perform(); 

Dans ce qui précède, quand les beans sont-ils instanciés, quand ApplicationContext est créé ou quand le getBean() est appelé?quand un bean printanier est instancié

Répondre

30

En supposant que le bean est un singleton et qu'il n'est pas configuré pour une initialisation paresseuse, il est créé lorsque le contexte est démarré. getBean() vient de le pêcher.

Les beans Lazy-init ne seront initialisés que lors de la première référence, mais ce n'est pas le cas par défaut. Les haricots à portée limitée (par exemple, à l'échelle du prototype) ne seront créés que lorsqu'ils seront référencés pour la première fois.

+0

Si un BeanFactory est utilisé, les beans sont-ils chargés paresseusement? –

+1

@java_geek: Eh bien 'BeanFactory' est juste une interface, cela dépend de l'implémentation que vous utilisez, mais généralement oui, la même chose vaut pour la plupart (sinon toutes) les implémentations' BeanFactory'. – skaffman

+0

@ Skaffman: Désolé, je comprends que si le bean a la portée est singleton il sera créé quand new applicantionContext Mais comment tester est-il créé ou non? Dans le prototype j'appelle getBeanDefinitionNames il apparaît toujours – Adam

11

Selon printemps documentation,

Le comportement par défaut pour les implémentations applicationContext est de pré-instancier avec impatience tous les haricots singleton au démarrage.

De plus, vous pouvez les configurer pour charger paresseusement.

+0

c'est le comportement pour les beans singleton. mais quel est le comportement des haricots normaux? –

+2

@java_geek: Les singletons * sont * normaux. ils sont le défaut. Qu'est-ce qui est normal pour toi? – skaffman

+0

je voulais savoir si singleton = false est réglé pour le bean –

9

Pour référence, voir

Voici une brève description de quand les haricots sont créés:

  • Un haricot singleton (qui est la valeur par défaut scope) qui n'a pas la propriété lazy-init définie sur true (la valeur par défaut est f alse) est construit lors de la création du contexte d'application
  • Un bean singleton dont la propriété lazy-init est définie sur true est construit lors de sa première demande
  • Un ensemble de beans dans toute autre portée est créé lorsqu'il est premier demandé (pour ce champ d'application).
1
  1. Par défaut, tous les haricots sont singletons, donc chaque fois que le contexte d'application est créée, ils sont tous pré-chargés. Si, en particulier, un bean singleton a un attribut lazy-init = "true", il sera paresseux, c'est-à-dire qu'il sera instancié lorsque la méthode getBean sera appelée pour la première fois.

  2. Pour les autres oscilloscopes, les haricots seront instanciés chaque fois qu'ils sont requis.