SpringBeanのライフサイクル学習

記事の参照アドレス、一部のコンテンツの補足と最適化

1。概要

  1. Beanとは

Beanと呼ばれるオブジェクトはアプリケーションのバックボーンであり、SpringIoCコンテナーによって管理されます。Beanは、Spring IoCコンテナーによってインスタンス化、アセンブル、および管理されるオブジェクトです。

  1. Beanを作成する方法

Springは、Beanの作成と注入を実現するために、xml構成、アノテーション構成、またはJava構成を提供します。

  1. IoCコンテナとの関係

Spring IoC(ApplicationContext)コンテナーは、Beanのスキャン、Beanの初期化、構成、および依存関係の管理を担当します。

2.関連事項

  1. Beanのアノテーションを宣言する
  • @Component 明確な役割のないコンポーネント
  • @Service ビジネスロジック層で使用されます
  • @Repository データアクセス層での使用
  • @Controller コントロールレイヤーで使用
  • @RestController 基本的に@ Controller + @ ResponseBodyの組み合わせ
  • @Configuration コンポーネントおよび類似のものですが、すべての@Bean注釈付きメソッドは動的プロキシになるため、呼び出しはメソッドの同じインスタンスであり、
  1. その他
  • @Scope Beanのスコープを指定します

    • singleton:SpringコンテナにはBeanインスタンスが1つだけあります。Springコンテナが破棄または終了しない限り、Beanインスタンスは常に存続します。
    • prototype:Beanが取得されるたびに新しいインスタンスが存在し、Springコンテナは返されたBeanインスタンスのライフサイクル全体を担当することはできません。
    • request:リクエストはWebプログラムにのみ適用可能であり、各HTTPリクエストは新しいBeanを生成し、Beanは現在のHTTPリクエストでのみ有効です。リクエストが終了すると、オブジェクトのライフサイクルは終了します。
    • session:セッションはWebプログラムにのみ適用可能です。セッションのスコープは、HTTP要求ごとに新しいBeanが生成されることを意味し、Beanは現在のHTTPセッションでのみ有効です。
    • application:アプリケーションはWebプログラム、グローバルスコープにのみ適用されます
  • @Bean メソッドレベルのBeanは通常、@ Configurationで使用されます。デフォルトでは、beanNameはメソッド名と同じです。

  • @PostConstruct XML構成のinit-methodに対応するinitMethodを指定します

  • @PreDestroy XML構成のdestroy-methodに対応するdestroyMethodを指定します

3.Beanのライフサイクル

巨視的に言えば、Beanのライフサイクルは、定義、初期化、使用、および破棄に分けられます。コードの観点からは、次のようになります。

フローチャート

ここに画像の説明を挿入

シーケンス図

ここに画像の説明を挿入

4.デモ

デモには、Springブートクラス、Beanオブジェクト、BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessorAdapterの5つのモジュールのコードが含まれます。

4.1 User.java
@Component
public class User implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    
    
    private String name;

    private BeanFactory beanFactory;
    private String beanName;

    public User() {
    
    
        System.out.println("【构造器】调用User的构造器实例化");
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        System.out.println("【注入属性】注入属性name");
        this.name = name;
    }

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

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

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

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

    /**
     * 这是DisposableBean接口方法
     */
    @Override
    public void destroy() {
    
    
        System.out.println("【DisposableBean接口】调用Disposable.destroy()");
    }

    /**
     * 通过<bean>的destroy-method属性指定的初始化方法
     */
    @PreDestroy
    public void userDestroy() {
    
    
        System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
    }

    @Override
    public String toString() {
    
    
        final StringBuilder sb = new StringBuilder("User{");
        sb.append("name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }
}
4.2 MyBeanFactoryPostProcessor.java
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
    
    public MyBeanFactoryPostProcessor() {
    
    
        super();
        System.out.println("这是BeanFactoryPostProcessor实现类构造器");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) {
    
    
        System.out.println("BeanFactoryPostProcessor调用postProcessBeanFactory方法");
        BeanDefinition bd = arg0.getBeanDefinition("user");
        bd.getPropertyValues().addPropertyValue("name", "picheng");
    }
}
4.3 MyBeanPostProcessor.java
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    
    
    public MyBeanPostProcessor() {
    
    
        super();
        System.out.println("这是BeanPostProcessor实现类构造器!");
    }

    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1) {
    
    
        System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!");
        return arg0;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1) {
    
    
        System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!");
        return arg0;
    }
}
4.4 MyInstantiationAwareBeanPostProcessor.java
@Component
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
    
    
    public MyInstantiationAwareBeanPostProcessor() {
    
    
        super();
        System.out.println("这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!");
    }

    /**
     * 接口方法、实例化Bean之前调用
     */
    @Override
    public Object postProcessBeforeInstantiation(Class beanClass,
                                                 String beanName) {
    
    
        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法");
        return null;
    }

    /**
     * 接口方法、实例化Bean之后调用
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
    
    
        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法");
        return bean;
    }

    /**
     * 接口方法、设置某个属性时调用
     */
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
    
    
        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法");
        return pvs;
    }
}
4.5 DemoApplication.java
@SpringBootApplication
public class DemoApplication {
    
    

    public static void main(String[] args) {
    
    
        System.out.println("现在开始初始化容器");

        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        System.out.println("容器初始化成功");
        // get user,并使用
        User user = context.getBean("user", User.class);
        System.out.println(user);

        System.out.println("现在开始关闭容器!");
        ((ConfigurableApplicationContext) context).close();
    }
}
4.6プログラムを実行し、結果を表示する

印刷されたログの数が多いため、重要な情報のみが傍受されます

现在开始初始化容器

// Porcessor初始化
这是BeanFactoryPostProcessor实现类构造器
BeanFactoryPostProcessor调用postProcessBeanFactory方法
这是BeanPostProcessor实现类构造器!
这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!

// Bean初始化
InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法
【构造器】调用User的构造器实例化
InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法
【注入属性】注入属性name
【BeanNameAware接口】调用BeanNameAware.setBeanName()
【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()
BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!
【init-method】调用<bean>的init-method属性指定的初始化方法
【InitializingBean接口】调用InitializingBean.afterPropertiesSet()
BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!
InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法
容器初始化成功

// Bean使用
User{
    
    name='picheng'}

// Bean销毁
现在开始关闭容器!
【destroy-method】调用<bean>的destroy-method属性指定的初始化方法
【DisposableBean接口】调用Disposable.destroy()

おすすめ

転載: blog.csdn.net/Dkangel/article/details/108201709