最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java深入講解Bean作用域與生命周期

 更新時間:2022年06月20日 10:38:54   作者:獨一無二的哈密瓜  
這篇文章主要介紹了淺談Spring中Bean的作用域和生命周期,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細講講,感興趣的可以學習一下

1. Bean 的作用域

1.1 觀看案例

現(xiàn)在有一個公共 Bean

@Component
public class UserBean {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("張三");
        user.setAge(18);
        return user;
    }
}

現(xiàn)在有一個用戶1, 進行了修改的操作

@Controller
public class UserControllerA {
    @Autowired
    private User user1;
    public User getUser1() {
        User user = user1;
        System.out.println("用戶1修改之前: " + user1);
        user.setName("王五");
        return user;
    }
}

現(xiàn)在有用戶2, 進行讀取操作

@Controller
public class UserControllerB {
    @Autowired
    private User user1;
    public User getUser1() {
        User user = user1;
        return user;
    }
}

打印用戶1和用戶2公共Bean的值

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserControllerA userControllerA = context.getBean("userControllerA",UserControllerA.class);
        User user = userControllerA.getUser1();
        System.out.println("用戶1修改之后: " + user);
        UserControllerB userControllerB = context.getBean("userControllerB",UserControllerB.class);
        User user1 = userControllerB.getUser1();
        System.out.println("用戶2讀取到的: " + user1);
    }

運行結(jié)果

原因:

Spring 中 Bean 的作用域默認是 singleton 單例模式. 所有人使用的都是同一個對象.

1.2 作用域的定義

之前所說的作用域, 是在程序中定義的某個變量的某個區(qū)域就叫做作用域.這里的Bean作用域不同.

Bean 的作用域指: Bean在 Spring 整個框架中的某種行為模式,

比如 singleton 單例作用域, 就表示 Bean 在整個 Spring 中只有一份, 它是全局共享的, 那么當其他人修改了這個值之后, 那么另一個人讀取到的就是被修改的值.

1.3 Bean 的 6 種作用域

Spring 容器在初始化一個 Bean 的示例時, 同時會指定該實例的作用域.

Spring 有 6 種作用域.

  • singleton: 單例作用域
  • prototype: 原型作用域 (多例作用域)
  • request: 請求作用域
  • session: 回話作用域
  • application: 全局作用域
  • websocket: HTTP WebSocket 作用域

3~6 這四種是 Spring MVC 中的值.

1.4 如何設(shè)置 Bean 的作用域

@Scope 既可以用于方法注解, 也可以用于類注解

① @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

② @Scope(“prototype”)

注意事項:

如果是 @Bean + @Scope , 這里的@Scope 就不能寫成類注解的方式了.

2. Bean 的生命周期

2.1 Bean 的執(zhí)行流程

  • 啟動 Spring 容器
  • 加載 Spring 配置文件
  • 加載 Spring 配置文件中的 Bean, 或根據(jù)配置文件中的組件根路徑, 進行 Bean 對象的掃描(掃描@Controller…)
  • Bean 注冊到 Spring 中
  • 執(zhí)行完畢,執(zhí)行銷毀操作

2.2 Bean 生命周期

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

實例化 Bean (為Bean分配內(nèi)存空間)

設(shè)置屬性 (Bean 進行初始化注入)

Bean 初始化 (一系列準備工作)

① 各種通知 (xxxAware)

② 執(zhí)行初始化前置方法 BeanPostProcessor

③ 執(zhí)行 @PostConstruct 初始化方法

④ 執(zhí)行 init-mehtod 初始化方法

⑤ 執(zhí)行初始化后置方法 BeanPostProcessor

使用 Bean

銷毀 Bean

  • ① 執(zhí)行銷毀前方法 @PreDestory
  • ② 如果有接口 DisposableBean, 執(zhí)行實現(xiàn)方法
  • ③ 執(zhí)行銷毀前的方法 destory-method

2.3 生命周期演示代碼

主要代碼

package com.wwzz.util;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("執(zhí)行通知: BeanNameAware " + s);
    }
    @PostConstruct
    public void postConstruct(){
        System.out.println("執(zhí)行 @PostConstruct");
    }
    public void init() {
        System.out.println("執(zhí)行 init-method");
    }
    @PreDestroy
    public void preDestroy(){
        System.out.println("執(zhí)行 @PreDestroy");
    }
    public void destroy() {
        System.out.println("執(zhí)行 destroy");
    }
}

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"> <!-- 配置 Spring 掃描的根路徑(此根路徑下的所有 Spring 存對象的注解才能生效) --> <content:component-scan base-package="com.wwzz"></content:component-scan> <beans> <bean id="beanLifeComponent" class="com.wwzz.util.BeanLifeComponent" init-method="init" destroy-method="destroy"></bean> </beans></beans><?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">
    <!-- 配置 Spring 掃描的根路徑(此根路徑下的所有 Spring 存對象的注解才能生效) -->
    <content:component-scan base-package="com.wwzz"></content:component-scan>
    <beans>
        <bean id="beanLifeComponent" class="com.wwzz.util.BeanLifeComponent" init-method="init" destroy-method="destroy"></bean>
    </beans>
</beans>

測試運行

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent",BeanLifeComponent.class);
        context.destroy();
    }

查看結(jié)果

到此這篇關(guān)于Java深入講解Bean作用域與生命周期的文章就介紹到這了,更多相關(guān)Bean作用域與生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot自定義注解開發(fā)指南

    SpringBoot自定義注解開發(fā)指南

    在開發(fā)SpringBoot程序的過程中,有可能與其他業(yè)務(wù)系統(tǒng)進行對接開發(fā),獲取封裝公共的API接口等等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot自定義注解的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Spring?Boot統(tǒng)一處理全局異常的實戰(zhàn)教程

    Spring?Boot統(tǒng)一處理全局異常的實戰(zhàn)教程

    最近在做項目時需要對異常進行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot統(tǒng)一處理全局異常的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)通關(guān)時間復雜度和空間復雜度

    Java數(shù)據(jù)結(jié)構(gòu)通關(guān)時間復雜度和空間復雜度

    對于一個算法,其時間復雜度和空間復雜度往往是相互影響的,當追求一個較好的時間復雜度時,可能會使空間復雜度的性能變差,即可能導致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于Java時間復雜度、空間復雜度的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 淺析java貪心算法

    淺析java貪心算法

    這篇文章簡單主要介紹了java貪心算法,包含貪心算法的基本思路,性質(zhì),以及實現(xiàn)示例,有需要的小伙伴參考下
    2015-02-02
  • java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例

    java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例

    這篇文章主要介紹了java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例,簡單介紹了隊列的相關(guān)基礎(chǔ)知識,然后通過實例向大家展示其實現(xiàn)方法,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 基于spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯

    基于spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯

    這篇文章主要介紹了spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Python連接Java Socket服務(wù)端的實現(xiàn)方法

    Python連接Java Socket服務(wù)端的實現(xiàn)方法

    這篇文章主要介紹了Python連接Java Socket服務(wù)端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 淺談java web中常用對象對應(yīng)的實例化接口

    淺談java web中常用對象對應(yīng)的實例化接口

    下面小編就為大家?guī)硪黄獪\談java web中常用對象對應(yīng)的實例化接口。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Ubuntu搭建Java開發(fā)環(huán)境筆記

    Ubuntu搭建Java開發(fā)環(huán)境筆記

    這篇文章主要介紹了Ubuntu搭建Java開發(fā)環(huán)境筆記,本文講解了JDK安裝、MyEclipse安裝及第一個Hello world程序等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Java容器源碼LinkedList原理解析

    Java容器源碼LinkedList原理解析

    這篇文章主要介紹了Java容器源碼LinkedList原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11

最新評論

布尔津县| 海伦市| 客服| 惠安县| 乾安县| 宁海县| 景东| 玉林市| 宁安市| 富源县| 锡林郭勒盟| 罗山县| 吉木萨尔县| 巴青县| 韩城市| 通城县| 德庆县| 临沭县| 尤溪县| 屏东县| 丹巴县| 石狮市| 汉寿县| 建宁县| 东山县| 浦东新区| 新余市| 民县| 通州区| 工布江达县| 潼南县| 博兴县| 崇州市| 炉霍县| 三穗县| 昭觉县| 富锦市| 文水县| 东丽区| 洛隆县| 九台市|