Table des matières
1.Bean scope
1.1 Cas Bean modifié
1.2 Pourquoi utiliser le mode singleton comme scope par défaut
1.3 Portée
1.4 Bean的6种作用域
1.5 设置作用域
2.Spring执行流程和Bean的生命周期
Au Spring, la portée d'un bean est appelée modèle comportemental, car selon Spring, le modèle singleton est un comportement, ce qui signifie qu'une seule copie du bean peut exister dans tout le Spring.
2.1.1生命周期演示
2.1.2 为什么要先设置属性,在进行初始化
Maison Java javaDidacticiel Quelle est la portée et le cycle de vie de Bean dans Java Spring

Quelle est la portée et le cycle de vie de Bean dans Java Spring

May 03, 2023 pm 09:19 PM
java spring bean

1.Bean scope

1.1 Cas Bean modifié

Quelle est la portée et le cycle de vie de Bean dans Java Spring

Raison : Bean scope est en mode singleton par défaut, ce qui signifie que tout le monde utilise le même objet ! Lorsque nous avons appris le mode singleton auparavant, nous savions tous que l'utilisation de singletons peut améliorer les performances dans une large mesure, donc la portée de Beans in Spring est également le mode singleton par défaut.

@Component
public class Users {

    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}
Copier après la connexion
@Component
public class Bean1 {

    @Autowired
    private User user;
    public User getUser(){
        System.out.println("Bean1对象未修改name之前 : "+user);
        user.setName("C++");
        return user;
    }
}
Copier après la connexion
@Component
public class Bean2 {
    @Autowired
    private User user;

    public User getUser(){
        return user;
    }
}
Copier après la connexion
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        Bean1 bean1 = context.getBean("bean1",Bean1.class);
        System.out.println(bean1.getUser());
        Bean2 bean2 = context.getBean("bean2",Bean2.class);
        System.out.println(bean2.getUser());
    }
}
Copier après la connexion

1.2 Pourquoi utiliser le mode singleton comme scope par défaut

  • Créez une seule copie de la même ressource, économisant de l'espace

  • Pas besoin de créer et de détruire trop d'objets, et la vitesse d'exécution est améliorée

1.3 Portée

La portée est généralement comprise comme : limiter la plage de variables disponibles dans un programme est appelé portée, ou une certaine zone du code source où les variables sont définies est appelée portée.
⽽La portée de Bea fait référence à un certain modèle de comportement de Bean dans tout le cadre de Spring, tel que singleton< / code> La portée Singleton signifie que <code>Bean n'a qu'une seule copie dans l'ensemble du Spring. Elle est partagée globalement, donc lorsque d'autres modifient cette valeur, après cela, ce qu'une autre personne lit est la. valeur modifiée. Bea的作⽤域是指BeanSpring整个框架中的某种⾏为模式,⽐如singleton单例作⽤域,就表
Bean在整个Spring中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个
⼈读取到的就是被修改的值。

在Spring中,bean 的作用域被称为是行为模式,因为在Spring看来,单例模式,就是一种行为,意味着在整个Spring中bean只能存在一份。

1.4 Bean的6种作用域

  • singleton:单例作⽤域

  • prototype:原型作⽤域(多例作⽤域)

  • request:请求作⽤域

  • session:会话作⽤域

  • application:全局作⽤域

  • websocket:HTTP WebSocket 作⽤域

后四种都是SpringMVC中限定使用的,因此现阶段我们只学前两个就行。

1.5 设置作用域

回到刚才的案例,Bean2希望获取到的bean对象是未被修改的,我们就可以将单例模式修改为多例模式。

使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Quelle est la portée et le cycle de vie de Bean dans Java Spring

Quelle est la portée et le cycle de vie de Bean dans Java Spring

使用@Scope("prototype")

Quelle est la portée et le cycle de vie de Bean dans Java Spring

2.Spring执行流程和Bean的生命周期

Quelle est la portée et le cycle de vie de Bean dans Java Spring

ps

Au Spring, la portée d'un bean est appelée modèle comportemental, car selon Spring, le modèle singleton est un comportement, ce qui signifie qu'une seule copie du bean peut exister dans tout le Spring.

1.4 6 types de portées de Bean

    singleton :
  • Portée d'instance unique

  • prototype :

    Portée du prototype (portée à instances multiples)
  • demande :
Portée de la demande :

Quelle est la portée et le cycle de vie de Bean dans Java Spring

Les quatre derniers sont tous Son utilisation est limitée dans SpringMVC, donc à ce stade, nous n'avons besoin d'apprendre que les deux premiers.
    1.5 Définition du scope
  • Revenant au cas tout à l'heure, Bean2 espère que l'objet bean obtenu n'a pas été modifié, afin que nous puissions modifier le mode singleton en mode instance multiple.

  • Utilisez @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  • Quelle est la portée et le cycle de vie de Bean dans Java Spring

    🎜 Quelle est la portée et le cycle de vie de Bean dans Java Spring🎜🎜Utiliser @Scope("prototype")🎜🎜Quelle est la portée et le cycle de vie du Bean dans Java Spring🎜🎜2. Processus d'exécution du Spring et cycle de vie du Bean🎜🎜Quelle est la portée et le cycle de vie de Bean dans Java Spring🎜🎜ps</ code > : Lorsque l'exécution atteint l'étape d'assemblage des propriétés du Bean, lorsque l'injection d'attribut est analysée, l'injection de classe sera arrêtée en premier et l'injection d'attribut sera prioritaire, car l'attribut pourra être utilisé dans des méthodes ultérieures. 🎜🎜2.1 Cycle de vie du haricot🎜🎜Le soi-disant cycle de vie fait référence à l'ensemble du processus de vie d'un objet, de la naissance à la destruction. Nous appelons ce processus le cycle de vie d'un objet. 🎜🎜🎜Le cycle de vie d'un Bean est divisé en 5 parties suivantes : 🎜🎜🎜🎜🎜1. Instancier le Bean (allouer de l'espace mémoire au Bean) 🎜🎜🎜🎜2. Définir les propriétés (injection et assemblage du Bean) 🎜. 🎜🎜🎜3 .Bean initialization🎜🎜🎜🎜 implémente diverses méthodes de notification Aware, telles que les méthodes d'interface BeanNameAware, BeanFactoryAware et ApplicationContextAware. Par exemple : lorsque Spring initialise un bean, il doit attribuer un identifiant (nom) au bean. Si le beanName est défini avec succès, une notification beadNameAware sera générée ; exécutez la pré-méthode d'initialisation de BeanPostProcessor (si cette méthode n'est pas remplacée, suivez le code source, exécutez la méthode d'initialisation @PostConstruct, qui sera exécutée après l'injection de dépendance) ; opération ; exécute l'init spécifié par vous-même. La méthode -method (si spécifiée) est la méthode spécifiée dans la balise du bean au Spring 🎜🎜🎜🎜🎜Cette méthode d'initialisation et la méthode ci-dessus initialisée avec des annotations sont des produits de deux périodes Init différentes ; est un produit de l'ère XML. @PostConstruct est un produit de l'ère des annotations. Priorité : lorsque la méthode de M. Liang existe en même temps, l'annotation sera exécutée en premier, puis init sera exécuté pour exécuter la post-méthode d'initialisation de BeanPostProcessor (si cette méthode n'est pas remplacée, suivez le code source). 🎜🎜🎜🎜4. Utilisez Bean🎜🎜🎜🎜5. Destroy Bean pour détruire diverses méthodes du conteneur, telles que @PreDestroy, méthode d'interface DisposableBean, méthode de destruction. 🎜</li></ul><p>@PreDestroy和destroy-method的关系和初始化方法的两个关系差不多<br/>优先级:@ProDestroy > 重写的DisposableBean接口方法 > destroy-method</p><p><strong>执行流程图如下:</strong></p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/164/168311995723732.png" class="lazy" alt="Quelle est la portée et le cycle de vie de Bean dans Java Spring" /></p><p><code>ps:实例化和初始化的区别:实例化就是 分配内存空间。初始化,就是把我们一些参数,方法的具体实现逻辑给加载进去。

    2.1.1生命周期演示

    Quelle est la portée et le cycle de vie de Bean dans Java Spring

    Quelle est la portée et le cycle de vie de Bean dans Java Spring

    xml配置如下:

    Quelle est la portée et le cycle de vie de Bean dans Java Spring

    Bean

    public class BeanLifeComponent implements BeanNameAware {
        @PostConstruct
        public void PostConstruct(){
            System.out.println("执行@PostConstruct");
        }
        public void init(){
            System.out.println("执行bean-init-method");
        }
        public void use(){
            System.out.println("正在使用bean");
        }
        @PreDestroy
        public void PreDestroy(){
            System.out.println("执行@PreDestroy");
        }
        public void setBeanName(String s){
            System.out.println("执行了Aware通知");
        }
    }
    Copier après la connexion

    启动类

    public class App2 {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class);
            beanLifeComponent.use();
            context.destroy();
        }
    }
    Copier après la connexion

    xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:content="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <content:component-scan base-package="com.beans"></content:component-scan>
        <bean id="1" class="com.beans.BeanLifeComponent" init-method="init"></bean>
    </beans>
    Copier après la connexion
    2.1.2 为什么要先设置属性,在进行初始化
    @Controller
    public class TestUser {
        @Autowired
        private Test test;
    
        public TestUser(){
            test.sayHi();
            System.out.println("TestUser->调用构造方法");
        }
    }
    Copier après la connexion

    如果这段代码先执行了初始化,也就是其构造方法,会用到test对象,此时还没有设置属性,test就为null,会造成空指针异常。因此必须先设置属性,在进行初始化。

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

PHP vs Python: comprendre les différences PHP vs Python: comprendre les différences Apr 11, 2025 am 12:15 AM

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

PHP: un langage clé pour le développement Web PHP: un langage clé pour le développement Web Apr 13, 2025 am 12:08 AM

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles