欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring執(zhí)行流程和Bean的生命周期詳解

 更新時間:2023年06月19日 09:58:40   作者:bushi橙子  
這篇文章主要介紹了Spring執(zhí)行流程和Bean的生命周期詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1、Spring執(zhí)行流程

Spring執(zhí)行流程(Bean執(zhí)行流程):1、在啟動類中遇到了ApplicationContext的時候就會啟動 Spring 容器 -> 2、根據(jù)容器設(shè)置的配置文件,去找相應的配置文件; ->3、如果有base-package,那么就去base-package里循環(huán)找所有的類,看有沒有五大類注解和方法注解; ->4、 如果有注解,進行初始化和屬性依賴賦值

2、Bean的生命周期(重點)

所謂生命周期是指一個對象從創(chuàng)建到銷毀的過程。

Bean的生命周期可分為以下5大部分:

1.實例化Bean:為Bean分配空間

2.**設(shè)置屬性:**為Bean注入屬性和裝配屬性

3.Bean初始化:

  • 實現(xiàn)各種通知方法:BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法。
  • 執(zhí)行前置方法(BeanPostProcessor接口)
  • 執(zhí)行初始化方法(設(shè)置了才會執(zhí)行)
    • 注解方式:@PostConstruct,依賴注入后被執(zhí)行(優(yōu)先級高,主流方式)
    • xml方式:init-method ?法
  • 執(zhí)行后置方法(BeanPostProcessor接口)

4.使用Bean

5.銷毀Bean:@PreDestroy、DisposableBean 接??法、destroy-method。

圖示化流程:

偽代碼流程(xml方式):

public class BeanLife implements BeanNameAware, BeanFactoryAware, BeanPostProcessor {
    /*
        各種通知
     */
    @Override
    public void setBeanName(String s) {
        //s 是設(shè)置的Bean名稱
        System.out.println("執(zhí)行了通知:BeanNameAware - > BeanName = "+s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("執(zhí)行了通知:BeanFactoryAware");
    }
    /*
        前置方法 :默認情況不會顯式調(diào)用
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("執(zhí)行了前置方法:postProcessBeforeInitialization");
        return bean;
    }
    /*
        初始化
     */
    public void myInit(){
        System.out.println("執(zhí)行了xml方式的初始化 - > init-method");
    }
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("執(zhí)行了注解的初始化 - > PostConstruct");
    }
    /*
        后置方法 :默認情況不會顯式調(diào)用
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("執(zhí)行了后置方法:postProcessAfterInitialization");
        return bean;
    }
    //使用Bean
    public void sayHi(){
        System.out.println("使用Bean -> sayHi()");
    }
    /*
        銷毀方法
     */
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("執(zhí)行了銷毀方法:PreDestroy");
    }
}

前置方法和后置方法: 默認不會顯式調(diào)用

? 1.可以把作用域改為prototype

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">
    <bean id="beanLife" class="com.spring.demo.BeanLife" scope="prototype" init-method="myInit"></bean>
</beans>

啟動類:

public class App {
    public static void main(String[] args) {
        //此處使用ClassPathXmlApplicationContext,因為ApplicationContext沒有銷毀方法
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.config.xml");
        BeanLife beanLife = context.getBean("beanLife",BeanLife.class);
       //使用bean
        beanLife.sayHi();
        //銷毀容器(bean也就銷毀了)
        context.destroy();
    }
}

執(zhí)行結(jié)果:

2.1、實例化和初始化的區(qū)別

實例化和屬性設(shè)置是java級別的系統(tǒng)“事件”,其操作過程不可人為干預和修改;而初始化是給開發(fā)者提供的,可以在實例化之后,類加載完成之前進行自定義“事件”處理。

2.2、為什么先設(shè)置屬性再進行初始化呢?

因為在初始化階段可能會用到bean的屬性和方法;如果不先設(shè)置屬性,先初始化,那么在初始化階段使用屬性,就報錯了;因為屬性此時還沒裝配呢。

@Controller
public class BController {
    @Autowired
    private User user1;//設(shè)置屬性
    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的屬性
        System.out.println(user1.toString());
    }
}
vate User user1;//設(shè)置屬性
    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的屬性
        System.out.println(user1.toString());
    }
}

到此這篇關(guān)于Spring執(zhí)行流程和Bean的生命周期的文章就介紹到這了,更多相關(guān)Spring Bean生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Data JPA使用Sort進行排序(Using Sort)

    Spring Data JPA使用Sort進行排序(Using Sort)

    本篇文章主要介紹了Spring Data JPA使用Sort進行排序(Using Sort),具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • java控制臺實現(xiàn)可視化日歷小程序

    java控制臺實現(xiàn)可視化日歷小程序

    這篇文章主要為大家詳細介紹了java控制臺實現(xiàn)可視化日歷小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java實現(xiàn)商品的查找、添加、出庫、入庫操作完整案例

    Java實現(xiàn)商品的查找、添加、出庫、入庫操作完整案例

    這篇文章主要介紹了Java實現(xiàn)商品的查找、添加、出庫、入庫操作,結(jié)合完整實例形式分析了java基于面向?qū)ο蟮纳唐沸畔⑻砑?、刪除、查找等相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • jenkins和sonar實現(xiàn)代碼檢測過程詳解

    jenkins和sonar實現(xiàn)代碼檢測過程詳解

    這篇文章主要介紹了jenkins和sonar實現(xiàn)代碼檢測過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java使用dom4j操作xml示例代碼

    java使用dom4j操作xml示例代碼

    dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件,下面我來個小例子學習他的使用方法
    2013-11-11
  • springboot使用kafka推送數(shù)據(jù)到服務(wù)端的操作方法帶認證

    springboot使用kafka推送數(shù)據(jù)到服務(wù)端的操作方法帶認證

    在使用Kafka進行數(shù)據(jù)推送時,遇到認證問題導致連接失敗,本文詳細介紹了Kafka的認證配置過程,包括配置文件的引入和參數(shù)設(shè)置,實際測試表明,需要正確配置sasl.jaas.config以及其他認證參數(shù),探討了配置文件是否可以同時存在多個配置塊的可能性,并提出了實際操作中的注意事項
    2024-11-11
  • SpringMVC中日期格式的轉(zhuǎn)換

    SpringMVC中日期格式的轉(zhuǎn)換

    本文主要介紹了SpringMVC中日期格式轉(zhuǎn)換的相關(guān)知識:用來解決日期提交轉(zhuǎn)換異常的問題。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Spring AOP訪問目標方法的參數(shù)操作示例

    Spring AOP訪問目標方法的參數(shù)操作示例

    這篇文章主要介紹了Spring AOP訪問目標方法的參數(shù)操作,結(jié)合實例形式詳細分析了spring面向切面AOP訪問目標方法的參數(shù)相關(guān)實現(xiàn)步驟與操作注意事項,需要的朋友可以參考下
    2020-01-01
  • Java二叉樹中LCA問題解決方法兩則

    Java二叉樹中LCA問題解決方法兩則

    這篇文章主要介紹了Java二叉樹中LCA問題解決方法,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2022-12-12
  • 如何使用兩個棧實現(xiàn)隊列Java

    如何使用兩個棧實現(xiàn)隊列Java

    這篇文章主要介紹了如何使用兩個棧實現(xiàn)隊列Java,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論