亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java?Spring中Bean的作用域及生命周期

 更新時(shí)間:2022年08月05日 17:03:33   作者:海綿寶寶養(yǎng)的的小窩  
這篇文章主要介紹了Java?Spring中Bean的作用域及生命周期,Bean的作用域默認(rèn)是單例模式的,也就是說(shuō)所有?的使?的都是同?個(gè)對(duì)象,更多相關(guān)內(nèi)容需要的朋友可以參考一下

1.Bean的作用域

1.1 被修改的Bean案例

原因:Bean的作用域默認(rèn)是單例模式的,也就是說(shuō)所有?的使?的都是同?個(gè)對(duì)象!之前我們學(xué)單例模式的時(shí)候都知道,使?單例可以很?程度上提?性能,所以在 Spring 中Bean 的作?域默認(rèn)也是 singleton 單例模式。

@Component
public class Users {

    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}
@Component
public class Bean1 {

    @Autowired
    private User user;
    public User getUser(){
        System.out.println("Bean1對(duì)象未修改name之前 : "+user);
        user.setName("C++");
        return user;
    }
}
@Component
public class Bean2 {
    @Autowired
    private User user;

    public User getUser(){
        return user;
    }
}
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());
    }
}

1.2 為什么使用單例模式作為默認(rèn)作用域

  • 相同資源只創(chuàng)建一份,節(jié)省空間
  • 不需要過(guò)多的創(chuàng)建和銷毀對(duì)象,執(zhí)行速度提高

1.3 作用域

作用域,一般理解為:限定程序中變量的可?范圍叫做作?域,或者說(shuō)在源代碼中定義變量的某個(gè)區(qū)域就叫做作?域。
?Bea的作?域是指BeanSpring整個(gè)框架中的某種?為模式,?如singleton單例作?域,就表
Bean在整個(gè)Spring中只有?份,它是全局共享的,那么當(dāng)其他?修改了這個(gè)值之后,那么另?個(gè)
?讀取到的就是被修改的值。

在Spring中,bean 的作用域被稱為是行為模式,因?yàn)樵赟pring看來(lái),單例模式,就是一種行為,意味著在整個(gè)Spring中bean只能存在一份。

1.4 Bean的6種作用域

  • singleton:單例作?域
  • prototype:原型作?域(多例作?域)
  • request:請(qǐng)求作?域
  • session:會(huì)話作?域
  • application:全局作?域
  • websocket:HTTP WebSocket 作?域

后四種都是SpringMVC中限定使用的,因此現(xiàn)階段我們只學(xué)前兩個(gè)就行。

1.5 設(shè)置作用域

回到剛才的案例,Bean2希望獲取到的bean對(duì)象是未被修改的,我們就可以將單例模式修改為多例模式。

使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

使用@Scope("prototype")

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

ps:當(dāng)執(zhí)行性到裝配Bean的屬性那一步時(shí),當(dāng)掃描到有屬性注入時(shí),會(huì)先停下類注入,優(yōu)先進(jìn)行屬性注入,因?yàn)楹竺娴姆椒赡軙?huì)用到該屬性。

2.1 Bean的生命周期

所謂的生命周期指的是一個(gè)對(duì)象從誕生到銷毀的整個(gè)生命過(guò)程,我們把這個(gè)過(guò)程就叫做一個(gè)對(duì)象的生命周期。

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

  • 1.實(shí)例化 Bean(為 Bean 分配內(nèi)存空間)
  • 2.設(shè)置屬性(Bean 注入和裝配)
  • 3.Bean 初始化
實(shí)現(xiàn)了各種 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的接口方法,例如:Spring在初始化 bean,是需要給 bean 賦予 id(name)。而設(shè)置 beanName 成功的話,就會(huì)生成一個(gè) beadNameAware 通知;執(zhí)行 BeanPostProcessor 初始化前置方法(如果沒(méi)有重寫此方法,按照源碼操作);執(zhí)行 @PostConstruct 初始化方法,依賴注入操作之后被 執(zhí)行;執(zhí)行自己指定的 init-method 方法(如果有指定的話),是Spring中bean標(biāo)簽內(nèi)指定的方法;

這個(gè)初始化方法和上面一個(gè)用注解初始化的方法是兩個(gè)不同時(shí)期的產(chǎn)物,init是xml時(shí)代產(chǎn)物,@PostConstruct是注解時(shí)代產(chǎn)物。優(yōu)先級(jí):當(dāng)梁總方法同時(shí)存在時(shí),優(yōu)先執(zhí)行注解,再執(zhí)行init執(zhí)行 BeanPostProcessor 初始化后置方法(如果沒(méi)有重寫此方法,按照源碼操作)。
  • 4.使用 Bean
  • 5.銷毀 Bean銷毀容器的各種方法, 如 @PreDestroy、DisposableBean 接口方法、destroy-method。

@PreDestroy和destroy-method的關(guān)系和初始化方法的兩個(gè)關(guān)系差不多
優(yōu)先級(jí):@ProDestroy > 重寫的DisposableBean接口方法 > destroy-method

執(zhí)行流程圖如下:

ps:實(shí)例化和初始化的區(qū)別:實(shí)例化就是 分配內(nèi)存空間。初始化,就是把我們一些參數(shù),方法的具體實(shí)現(xiàn)邏輯給加載進(jìn)去。

2.1.1生命周期演示

xml配置如下:

Bean

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

啟動(dòng)類

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();
    }
}

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>

2.1.2 為什么要先設(shè)置屬性,在進(jìn)行初始化

@Controller
public class TestUser {
    @Autowired
    private Test test;

    public TestUser(){
        test.sayHi();
        System.out.println("TestUser->調(diào)用構(gòu)造方法");
    }
}

如果這段代碼先執(zhí)行了初始化,也就是其構(gòu)造方法,會(huì)用到test對(duì)象,此時(shí)還沒(méi)有設(shè)置屬性,test就為null,會(huì)造成空指針異常。因此必須先設(shè)置屬性,在進(jìn)行初始化。

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

相關(guān)文章

  • Java實(shí)現(xiàn)棧和隊(duì)列面試題

    Java實(shí)現(xiàn)棧和隊(duì)列面試題

    這篇文章主要介紹了Java實(shí)現(xiàn)棧和隊(duì)列的面試題,每個(gè)例題代碼實(shí)現(xiàn)非常詳細(xì),每一個(gè)方法講解也很到位,特別適合參加Java面試的朋友閱讀。
    2015-09-09
  • mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐

    mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐

    本文主要介紹了mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java單例的寫法詳解

    Java單例的寫法詳解

    在java中,單例有很多種寫法,面試時(shí),手寫代碼環(huán)節(jié),除了寫算法題,有時(shí)候也會(huì)讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點(diǎn)。需要的朋友可以參考下
    2021-09-09
  • Java切面(Aspect)的多種實(shí)現(xiàn)方式

    Java切面(Aspect)的多種實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java切面(Aspect)的多種實(shí)現(xiàn)方式,在Java開發(fā)中切面(Aspect)是一種常用的編程方式,用于實(shí)現(xiàn)橫切關(guān)注點(diǎn)(cross-cutting concern),需要的朋友可以參考下
    2023-08-08
  • Java算法練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)

    Java算法練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)

    方法下面小編就為大家?guī)?lái)一篇Java算法的一道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot整合WebService的實(shí)現(xiàn)示例

    SpringBoot整合WebService的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot整合WebService,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Spring+MyBatis多數(shù)據(jù)源配置實(shí)現(xiàn)示例

    Spring+MyBatis多數(shù)據(jù)源配置實(shí)現(xiàn)示例

    本篇文章主要介紹了Spring+MyBatis多數(shù)據(jù)源配置實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java中的@PreAuthorize注解使用詳解

    Java中的@PreAuthorize注解使用詳解

    這篇文章主要介紹了Java中的@PreAuthorize注解使用詳解,@PreAuthorize注解會(huì)在方法執(zhí)行前進(jìn)行權(quán)限驗(yàn)證,支持Spring EL表達(dá)式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下
    2023-10-10
  • Spring如何實(shí)現(xiàn)管理事務(wù)

    Spring如何實(shí)現(xiàn)管理事務(wù)

    Spring通過(guò)編程式事務(wù)和聲明式事務(wù)管理來(lái)控制事務(wù)的邊界和行為,聲明式事務(wù)管理通過(guò)@Transactional注解實(shí)現(xiàn),提供了豐富的配置選項(xiàng)來(lái)控制事務(wù)的行為,如傳播行為、隔離級(jí)別、超時(shí)時(shí)間和回滾規(guī)則
    2024-11-11
  • Java 時(shí)間日期詳細(xì)介紹及實(shí)例

    Java 時(shí)間日期詳細(xì)介紹及實(shí)例

    這篇文章主要介紹了Java 時(shí)間日期詳細(xì)介紹及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論