春のスタートアッププロセスとBeanのライフサイクル

I.概要

SpringのIOCコンテナの使用には、おおよそ次の手順があります。

最初のステップ:Springを開始して、完全なBeanを生成します。

  1. Beanファクトリを生成する
  2. xmlを解析してBeanDefinitionを生成します
  3. BeanFactoryPostProcessorを使用してBeanFactoryを拡張する
  4. Beanの作成(インスタンス化); BeanPostProcessorを使用してBeanを拡張し、init-method(初期化)を呼び出します
  5. 完全なBeanオブジェクトを取得する

ステップ2:実際のビジネスでBeanを使用する

  1. 工場から豆を入手して使用する

ステップ3:IOCコンテナーを閉じて、Beanを破棄します

  1. Beanを破壊するにはdestroyを呼び出します

2つ目は、XMLがBeanDefinitionを生成することです。

XMLベースのBean構成ファイルをBeanDefinitionに解析するプロセス:

3つ目は、SpringBootが完全なBeanを生成することです。

第四に、春の延長

5つの簡単なプロセスシミュレーション

1.入口を開始します

package com.wuxiaolong.edu.common.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    
    

    public static void main(String[] args) {
    
    

        System.out.println("》》》》》》第一阶段=容器初始化开始《《《《《《");
        AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(ConfigBean.class);
        System.out.println("》》》》》》第一阶段=容器初始化结束《《《《《《");


        System.out.println("》》》》》》第二阶段=获取person对象开始《《《《《《");
        Person person = factory.getBean("person",Person.class);
        System.out.println(person);
        System.out.println("》》》》》》第二阶段=获取person对象结束《《《《《《");


         System.out.println("》》》》》》第三阶段=关闭容器开始《《《《《《");
         factory.registerShutdownHook();
         System.out.println("》》》》》》第三阶段=关闭容器结束《《《《《《");
    }

}

2.スキャンコードパスを設定します

package com.wuxiaolong.edu.common.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 配置启动入口
 *  定义扫描的路径
 *  并将Person作为bean
 *
 */
@ComponentScan("com.wuxiaolong.edu.common.spring")
@Configuration
public class ConfigBean {
    
    

    public ConfigBean() {
    
    
        System.out.println("【ConfigBean】构造器");
    }

    @Bean
    public Person person(){
    
    
        return new Person();
    }
}

3.オブジェクトを定義します

package com.wuxiaolong.edu.common.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;


import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 通过@Bean标签将Person注册成Bean
 * Person实现BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean接口
 * Person实例化后会调用BeanFactoryAware, BeanNameAware, InitializingBean实现的接口
 * 容器关闭时会调用DisposableBean的接口
 */
public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
    
    

    private String name;
    private String address;
    private int phone;

    private BeanFactory beanFactory;
    private String beanName;

    public Person() {
    
    
        System.out.println("【Person】构造器");
    }


    /**
     * 这是BeanFactoryAware接口方法
     */
    @Override
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
    
    
        System.out.println("【BeanFactoryAware】 setBeanFactory()");
        this.beanFactory = arg0;
    }

    /**
     * 这是BeanNameAware接口方法
     */
    @Override
    public void setBeanName(String arg0) {
    
    
        System.out.println("【BeanNameAware】setBeanName()" + arg0);
        this.beanName = arg0;
    }

    /**
     * 这是InitializingBean接口方法
     */
    @Override
    public void afterPropertiesSet() throws Exception {
    
    
        System.out.println("【InitializingBean】afterPropertiesSet()");
    }

    /**
     * 对象初始化的时候(实例化之后)会调用该方法
     *这是DiposibleBean接口方法
     */
    @Override
    public void destroy() throws Exception {
    
    
        System.out.println("【DiposibleBean】destory()");
    }

    /**
     * 也可以通过<bean>标签的init-method属性指定的初始化方法
     */
    @PostConstruct
    public void myInit() {
    
    
        System.out.println("【@PostConstruct】调用指定的初始化方法");
    }

    /**
     *
     * 也可以通过<bean>标签的destroy-method属性指定的初始化方法
     */
    @PreDestroy
    public void myDestory() {
    
    
        System.out.println("【@PreDestroy】@PreDestroy 调用指定的销毁前的方法");
    }


    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    public int getPhone() {
    
    
        return phone;
    }

    public void setPhone(int phone) {
    
    
        this.phone = phone;
    }

    public BeanFactory getBeanFactory() {
    
    
        return beanFactory;
    }

    public String getBeanName() {
    
    
        return beanName;
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", phone=" + phone +
                //", beanFactory=" + beanFactory +
                ", beanName='" + beanName + '\'' +
                '}';
    }
}

4.BeanFactoryを拡張します

package com.wuxiaolong.edu.common.spring;


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

/**
 * 通过实现BeanFactoryPostProcessor接口,参与到BeanFactory实例化的过程中,可以做一些定制化的操作
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
    

    public MyBeanFactoryPostProcessor() {
    
    
        super();
        System.out.println("【BeanFactoryPostProcessor】构造器");
    }

    /**
     * person对象实例化前,给该bean附上初始值
     * @param arg0
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
    
    
        System.out.println("【BeanFactoryPostProcessor】postProcessBeanFactory");
        BeanDefinition bd = arg0.getBeanDefinition("person");
        bd.getPropertyValues().addPropertyValue("phone", "110");
    }
}

5.拡張Bean

package com.wuxiaolong.edu.common.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;

/**
 * 容器中每个bean实例化后,都可以通过实现BeanPostProcessor接口参与到bean的初始化过程中。
 * 多个自定义的BeanPostProcessor,可以通过实现PriorityOrdered决定加载的顺序
 * 每个bean初始化时都会调用BeanPostProcessor的postProcessBeforeInitialization()和postProcessAfterInitialization()方法
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {
    
    

    public MyBeanPostProcessor() {
    
    
        super();
        System.out.println("【BeanPostProcessor】构造器");
    }

    /**
     * bean初始化之前执行的方法
     * 第一个参数都是要处理的Bean对象,
     * 第二个参数都是Bean的name。
     * 返回值也都是要处理的Bean对象。
     */
    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
    
    
        System.out.println("【BeanPostProcessor】postProcessBeforeInitialization : " + arg1);
        return arg0;
    }

    /**
     * bean初始化之后执行的方法
     * 第一个参数都是要处理的Bean对象,
     * 第二个参数都是Bean的name。
     * 返回值也都是要处理的Bean对象。
     */
    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
    
    
        System.out.println("【BeanPostProcessor】postProcessAfterInitialization  : " + arg1);
        return arg0;
    }

    /**
     * 多个BeanPostProcessor时,决定BeanPostProcessor加载的顺序
     */
    @Override
    public int getOrder() {
    
    
        System.out.println("---------0--------");
        return 0;
    }
}

6.実行結果

》》》》》》第一阶段=容器初始化开始《《《《《《
【BeanFactoryPostProcessor】构造器
【BeanFactoryPostProcessor】postProcessBeanFactory
【BeanPostProcessor】构造器
【BeanPostProcessor】postProcessBeforeInitialization : org.springframework.context.event.internalEventListenerProcessor
【BeanPostProcessor】postProcessAfterInitialization  : org.springframework.context.event.internalEventListenerProcessor
【BeanPostProcessor】postProcessBeforeInitialization : org.springframework.context.event.internalEventListenerFactory
【BeanPostProcessor】postProcessAfterInitialization  : org.springframework.context.event.internalEventListenerFactory

【ConfigBean】构造器
【BeanPostProcessor】postProcessBeforeInitialization : configBean
【BeanPostProcessor】postProcessAfterInitialization  : configBean

【Person】构造器
【BeanNameAware】setBeanName()person
【BeanFactoryAware】 setBeanFactory()
【BeanPostProcessor】postProcessBeforeInitialization : person
【@PostConstruct】调用指定的初始化方法
【InitializingBean】afterPropertiesSet()
【BeanPostProcessor】postProcessAfterInitialization  : person
》》》》》》第一阶段=容器初始化结束《《《《《《


》》》》》》第二阶段=获取person对象开始《《《《《《
Person{
    
    name='null', address='null', phone=110, beanName='person'}
》》》》》》第二阶段=获取person对象结束《《《《《《


》》》》》》第三阶段=关闭容器开始《《《《《《
》》》》》》第三阶段=关闭容器结束《《《《《《
【@PreDestroy@PreDestroy 调用指定的销毁前的方法
【DiposibleBean】destory()

公式アカウントをフォローし、「java-summaryと入力してソースコードを取得します。

終わった、それを一日と呼んでください!

[知識の普及、価値の共有]、あなたの注意とサポートに感謝します、私は[ Zhuge Xiaoyuan ]、ためらいに苦しんでいるインターネット移民労働者です。

おすすめ

転載: blog.csdn.net/wuxiaolongah/article/details/114226078