web-dev-qa-db-fra.com

Comportement par défaut du printemps pour lazy-init

Je suis débutant au printemps, ESP Inversion du contrôle. J'étais perplexe de comprendre la différence entre ce qui suit

 <bean id="demo" class="Demo" lazy-init="false"/>
 <bean id="demo" class="Demo" lazy-init="true"/>
 <bean id="demo" class="Demo" lazy-init="default"/>

À ma connaissance, lazy-init = false crée le bean au démarrage et lazy-init = true ne crée pas de bean au démarrage, mais crée le bean à la demande d'un bean particulier. Corrigez-moi ici, si mon interprétation est fausse.

quel est le comportement par défaut de lazy-init? Comment cela instancierait-il?

54
srk

Le comportement par défaut est false:

Par défaut, les implémentations ApplicationContext créent et configurent avec impatience tous les beans singleton dans le cadre du processus d'initialisation. En règle générale, cette pré-instanciation est souhaitable car les erreurs de configuration ou d’environnement immédiat sont immédiatement détectées, par opposition à des heures voire des jours plus tard. Lorsque ce comportement n'est pas souhaitable, vous pouvez empêcher la pré-instanciation d'un bean singleton en marquant la définition du bean comme étant initialisée paresseuse. Un bean initialisé paresseux indique au conteneur IoC de créer une instance de bean lorsqu'elle est demandée pour la première fois, plutôt qu'au démarrage.

Je suggère de lire

62
Vjeetje

Pour ceux qui viennent ici et utilisent Java config), vous pouvez définir le Bean sur lazy-init en utilisant des annotations comme celle-ci:

Dans la classe de configuration:

@Configuration
// @Lazy - For all Beans to load lazily
public class AppConf {

    @Bean
    @Lazy
    public Demo demo() {
        return new Demo();
    }
}

Pour la numérisation et le câblage automatique des composants:

@Component
@Lazy
public class Demo {
    ....
    ....
}

@Component
public class B {

    @Autowired
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
    private Demo demo;

    .......
 }
24
DavidR

Le lazy-init="default" le réglage sur bean ne fait référence qu’à ce qui est défini par le default-lazy-init attribut de l'élément beans englobant. La valeur implicite par défaut de default-lazy-init est false.

Si il n'y a pas lazy-init attribut spécifié sur un bean, il est toujours instancié avec impatience.

21
zagyi

lazy-init est l'attribut de bean. Les valeurs de lazy-init peuvent être vraies et fausses. Si lazy-init est true, alors ce bean sera initialisé lorsqu’une demande est faite à bean. Ce haricot ne sera pas initialisé lors de l'initialisation du conteneur de ressort et si lazy-init est false, le haricot sera initialisé avec l'initialisation du conteneur de ressort.

3
Carl Massaad

Lorsque nous utilisons lazy-init = "default" comme attribut dans element, le conteneur récupère la valeur spécifiée par default-lazy-init = "true | false" attribut de element et l'utilise comme lazy-init = "true | false".

Si l'attribut default-lazy-init n'est pas présent dans l'élément, lazy-init = "default" dans l'élément se comportera comme si lazy-init- "false".

1
Prashant_M