国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

這篇具有很好參考價值的文章主要介紹了@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一. @Autowired 和 @Resource 注解

二. Bean的作用域?

1.?singleton(單例模式)

2.?prototype(原型模式)(多例模式)

3. 請求作用域:request

4. 會話作用域:session

三. Spring 的執(zhí)行流程

四. Bean 的生命周期?

?1. 實例化

?2. 設置屬性?

3. Bean 初始化??

? ?3.1 執(zhí)行各種各種 Aware 通知;?

? ?3.2 執(zhí)行初始化前置方法;

? ?3.3 執(zhí)行初始化方法;

? ?3.4 執(zhí)行初始化后置方法;?

4. 使用 Bean 對象

5. 銷毀 Bean 對象?

6. 代碼演示?


一. @Autowired 和 @Resource 注解

在前面的文章中,我們介紹了通過 @Autowired 注解的方式來獲取到Spring容器中的Bean對象,實際上,還有另一個注解:@Resource,它的功能也是差不多的,也可以從 Spring容器中獲取到Bean對象,但也是存在一定的差別的。?

  1. @Resource 來自于 jdk,而 @Autowired 來自于 Spring;
  2. 使?時設置的參數(shù)不同:相?于 @Autowired 來說,@Resource ?持更多的參數(shù)設置,例如
    name 設置,根據(jù)名稱獲取 Bean;
  3. @Autowired 可?于 Setter 注?、構造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注?和屬性注?,不能?于構造函數(shù)注?;
  4. @Autowired在獲取Bean對象的時候,先根據(jù)類型查找,之后再根據(jù)名稱查找;而@Resource先根據(jù)名稱查找,之后再根據(jù)類型查找;

問題分析:當在 Spring 中存放多個同一類型 Bean 對象的時候,使用 @Autowired 去獲取 Bean對象會出錯。

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

    @Bean
    public User user2(){
        User user = new User();
        user.setAge(22);
        user.setId(11);
        user.setName("李四");
        return user;
    }
}
@Controller
public class UserController2 {
    @Autowired
    private User user;

    public void sayHi(){
        System.out.println("do UserController2");
        System.out.println(user.getName());
    }
}

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    UserController2 userController2 = context.getBean("userController2",UserController2.class);
        userController2.sayHi();
    }
}

此時執(zhí)行是會報錯的,因為 @Autowired 注解先通過類型去查找,得到了 user1 和 user2 兩個 Bean對象,但是根據(jù) user 名稱來去查找的話,是沒有找到對應的 Bean 對象的,因此會報錯。(查找 Bean 對象的默認名稱為 添加 @Autowired 注解的對應屬性名稱,也就是上述第二段代碼的private User user)?

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

?解決辦法1:修改 @Autowired 注解的對應屬性名稱

@Controller
public class UserController2 {
    @Autowired
    private User user1;

    public void sayHi(){
        System.out.println("do UserController2");
        System.out.println(user1.getName());
    }
}

此時運行代碼就會獲取到對應的 Bean對象,也就是存儲的 user1 對象。

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程?

解決辦法2:配合使? @Qualifier 注解定義名稱

@Qualifier(value = "Bean對象的名稱")?

@Controller
public class UserController2 {
    @Autowired
    @Qualifier(value="user1")
    private User user;

    public void sayHi(){
        System.out.println("do UserController2");
        System.out.println(user.getName());
    }
}

也可以得到預期的結果。?

?@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

解決辦法3:使? @Resource(name="Bean對象名稱") 定義

@Controller
public class UserController2 {
    
    @Resource(name="user1")
    private User user;

    public void sayHi(){
        System.out.println("do UserController2");
        System.out.println(user.getName());
    }
}

?同樣是可以得到預期結果的。

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程?

二. Bean的作用域?

限定程序中變量的可?范圍叫做作用域,或者說在源代碼中定義變量的某個區(qū)域就叫做作用域。而?Bean 的作?域是指 Bean 在 Spring 整個框架中的某種行為模式。

1.?singleton(單例模式)

singleton 表示的是單例作用域,類似于之前講過的單例模式。這也是默認情況下的行為模式。在該作用域下的 Bean 在 IoC容器中只存在一個實例,獲取到的 Bean 以及對 Bean 進行修改,都是針對同一個 Bean 對象。

代碼演示:?

1. 往 Spring 容器中注入一個 User 對象?

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

2.? 通過@Autowired獲取到Bean對象,并對其進行修改

@Controller
public class UserController {
    @Autowired
    private User user;

    public void printUser(){
        System.out.println(user);
        // 修改 User
        User myUser = user;     // 給引用對象賦值,其實就是共享對象?。?!這兩個變量指向了同一個地址
        myUser.setName("李四");
        System.out.println("myUser -> " + myUser);
        System.out.println("User -> " + user);  
    }
}

3. 再新建一個類,通過 @Autowired 獲取到Bean對象?


@Controller
public class UserController2 {

    @Resource
    private User user;

    public void printUser2(){
        System.out.println("user -> " + user);  
        // Bean 作用域 -> 默認是單例模式 = 此 Bean 在整個框架(Spring 容器)中只有一份
    }
}

?4. 最后輸出觀察結果


public class App {
    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        UserController userController = context.getBean("userController",UserController.class);
        userController.printUser();

        UserController2 userController2 = context.getBean("userController2",UserController2.class);
        userController2.printUser2();

    }
}

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

因此也可以得出結論:singleton 單例作用域,他們使用的 Bean 都是 Spring 容器中的同一個對象。這個 Bean 在整個 Spring 中只有一份,是全局共享的,當其他人修改了這個值之后,那么另一個人讀到的就是被修改后的值了。

2.?prototype(原型模式)(多例模式)

?在原型模式下,每次對該作用域下的 Bean 的請求都會創(chuàng)建新的實例,也就是說每次獲取 Bean 對象和修改 Bean 對象都是針對新的 Bean 對象實例而言的。

需要添加注解 @Scope("prototype") 或者@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

代碼演示:?

@Component
public class UserBeans {
    @Bean
    @Scope("prototype")
    //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public User user(){
        User user = new User();
        user.setId(1);
        user.setName("張三");
        return user;
    }
}

?再次運行得到結果:

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

可以看出,在第二次通過 @Autowired 獲取到 Bean 對象的時候,得到的是一個新的實例對象了。

3. 請求作用域:request

?每次 http 請求會創(chuàng)建新的 Bean 實例。適用于?次 http 的請求和響應的共享 Bean 的情況。

?限定SpringMVC中使?。

4. 會話作用域:session

在?個http session中,定義?個 Bean 實例。每次 Session 會話共享一個 Bean 對象。限定SpringMVC中使?。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-439344.html

三. Spring 的執(zhí)行流程

?@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程?

四. Bean 的生命周期?

?1. 實例化

給 Bean 對象分配內(nèi)存空間。?

此處要注意:初始化不等于實例化?。?!

類的初始化是完成程序前的準備工作,在這個階段,靜態(tài)的會被執(zhí)行,同時會開辟一塊存儲空間用來存放靜態(tài)的數(shù)據(jù),初始化只在類加載的時候執(zhí)行一次,也可以理解為給對象賦值的過程。

類的實例化,是指創(chuàng)建一個對象的過程,這個過程會在堆中開辟內(nèi)存,將一些非靜態(tài)的方法,變量存放在里面,在程序執(zhí)行的過程中,可以創(chuàng)建多個對象,即多次實例化,每次實例化都會開辟一塊新的內(nèi)存。?

?2. 設置屬性?

看需求,有的 Bean 對象需要被注入屬性,這個屬性也會是已經(jīng)在 Spring 容器中的 Bean,如果該屬性還不存在于 Spring 中,那么會先去將該屬性 Bean 存儲到 Spring 中。?

3. Bean 初始化??

? ?3.1 執(zhí)行各種各種 Aware 通知;?

實現(xiàn)了各種 Aware 通知的?法,如 BeanNameAware、BeanFactoryAware、
ApplicationContextAware 的接??法;

? ?3.2 執(zhí)行初始化前置方法;

? ?3.3 執(zhí)行初始化方法;

有兩種方式,第一種是通過注解?@PostConstruct?,依賴注?操作之后執(zhí)行注解修飾的方法;第二種是通過 xml 的方式,執(zhí)行自己指定的 init-method ?法。如果兩者都存在,那么先執(zhí)行注解的初始化方法。

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程?

? ?3.4 執(zhí)行初始化后置方法;?

?

4. 使用 Bean 對象

通過 getBean() 方法來獲取容器中的 Bean 對象并使用。?

5. 銷毀 Bean 對象?

銷毀容器的各種?法,如 @PreDestroy、DisposableBean 接??法、destroy-method(XML的方式)。 ?

6. 代碼演示?

public class App {
    public static void main(String[] args) {
// 此時要使用 ApplicationContext 的子類,因為它本身是沒有銷毀方法的
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanComponent beanComponent = context.getBean("beanComponent",BeanComponent.class);
        beanComponent.sayHi();
        context.close();
    }
}

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("執(zhí)行了通知 BeanName -> " + s);
    }

    /**
     * xml 方式的初始化方法
     */
    public void myInit(){
        System.out.println("XML 方式初始化");
    }


    @PostConstruct
    public void doPostConstruct(){
        System.out.println("注解的初始化方法");
    }

    public void sayHi(){
        System.out.println("執(zhí)行 sayHi()");
    }

    // 銷毀的方法,銷毀的時候執(zhí)行的一個方法
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("do PreDestroy");
    }
}

@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

?@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程

?

到了這里,關于@Autowired和@Resource注解之間的關系區(qū)別,Bean的作用域和生命周期,Spring的執(zhí)行流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Bean 作用域和生命周期

    Bean 作用域和生命周期

    Spring 容器是用來存儲和讀取 Bean 的 , 因此 Bean 是 Spring 中最核心的操作資源. 編寫代碼過程中 , bean 對象如果有多個屬性 , 創(chuàng)建 Getter , Setter, 構造方法 等方法 , 會產(chǎn)生大量冗長的代碼. 那么為了使代碼更加簡潔 , 我們可以使用 Lombok 框架 , 只需要一行注釋 , 就可以避免大量冗長

    2024年02月05日
    瀏覽(50)
  • @Resource和@Autowired的區(qū)別

    @Resource和@Autowired這兩個注解的作用都是在Spring生態(tài)里面去實現(xiàn)Bean的依賴注入 首先,@Autowired是Spring里面提供的一個注解,默認是根據(jù)類型來實現(xiàn)Bean的依賴注入。 @Autowired注解里面有一個required屬性默認值是true,表示強制要求bean實例的注入,在應用啟動的時候,如果IOC容器里

    2024年02月08日
    瀏覽(18)
  • Bean的作用域和生命周期

    Bean的作用域和生命周期

    目錄 1.作?域定義 1.1Bean的6個作用域 1.singleton:單例作用域 2.prototype:多例作用域 3.request:請求作用域 4.session:會話作用域 5.application:全局作用域 6.websocket:HTTP WebSocket作用域 單例作?域(singleton) VS 全局作?域(application) 1.2設置作用域 1.直接設置值@Scope(\\\"potptype\\\") 2.用枚舉設置:@Scop

    2024年02月02日
    瀏覽(25)
  • Spring | Bean 作用域和生命周期

    Spring | Bean 作用域和生命周期

    Spring 是用來讀取和存儲 Bean,因此在 Spring 中 Bean 是最核心的操作資源,所以接下來我們深入學習?下 Bean 對象 假設現(xiàn)在有?個公共的 Bean,提供給 A 用戶和 B 用戶使用,然而在使用的途中 A 用戶卻 “悄悄” 地修改了公共 Bean 的數(shù)據(jù),導致 B 用戶在使用時發(fā)生了預期之外的邏

    2024年02月14日
    瀏覽(21)
  • Spring(Bean 作用域和生命周期)

    Spring(Bean 作用域和生命周期)

    目錄 1. 案例1: Bean作用域的問題 2. 作用域 3. 設置 Bean 的作用域 4. Spring 的執(zhí)行流程 5. Bean 的生命周期 現(xiàn)在有一個公共的 Bean,通過給 A 用戶 和 B 用戶使用, 然后在使用的過程中 A 偷偷的修改了公共 Bean 的數(shù)據(jù), 導致 B 在使用時發(fā)生了預期之外的邏輯錯誤 (1) 公共 Bean:? ?[名稱是

    2024年02月19日
    瀏覽(78)
  • @Autowired 和 @Resource 的區(qū)別是什么?

    Java面試題目錄 @Autowired 和 @Resource 的區(qū)別是什么? @Autowired 是 Spring 提供的注解。默認的注入方式為byType(根據(jù)類型進行匹配)。 @Resource 是 JDK 提供的注解。默認注入方式為 byName(根據(jù)名稱進行匹配)。 當一個接口存在多個實現(xiàn)類的情況下,@Autowired 和@Resource都需要通過名稱

    2024年01月19日
    瀏覽(26)
  • 【Spring】Bean的作用域和生命周期

    【Spring】Bean的作用域和生命周期

    目錄 一、引入案例來探討B(tài)ean的作用域 二、Bean的作用域 2.1、Bean的6種作用域 2.2、設置Bean的作用域 三、Spring的執(zhí)行流程 ?四、Bean的聲明周期 1、生命周期演示 首先我們創(chuàng)建一個User類,定義一個用戶信息,在定義一個Users類,使用方法注解將user存入Spring中,然后兩個用戶A對這

    2024年02月14日
    瀏覽(24)
  • 【JavaEE進階】Bean 作用域和生命周期

    【JavaEE進階】Bean 作用域和生命周期

    注意在此例子中需要用到lombok lombok是什么? Lombok 是一個 Java 庫,它通過注解的方式來簡化 Java 代碼的編寫。它提供了一組注解,讓我們可以通過在代碼中添加這些注解來自動生成樣板式的代碼,如 getter、setter、構造函數(shù)、toString 等。 使用 Lombok 可以有效地減少冗余的樣板代

    2024年02月12日
    瀏覽(25)
  • Spring Bean的作用域和生命周期

    Spring Bean的作用域和生命周期

    Bean 的作用域指的是 Bean 在 Spring 容器中的行為(Bean 實例創(chuàng)建及生命周期),它的行為是由 Spring 來管理的,可以根據(jù)具體情況選擇不同的作用域來達到性能優(yōu)化、資源利用最大化和可維護性等目的。 Bean 作用域(Scope)類型主要有如下幾種: 其中前兩種是 Spring 核心作用域,

    2024年02月12日
    瀏覽(30)
  • 簡述@Autowired和@Resource的區(qū)別(通俗易懂)

    前言:在日常的開發(fā)項目當中,這兩個注解是經(jīng)常會用到的,但是在實際使用當中好像使用起來并沒有多大區(qū)別,這里我就對這兩個注解進行一個詳細的區(qū)別總結,通過一個完整的典型例子進行論證,思路清晰明了。 目錄 一、結論 二、典型案例 2.1、準備代碼 2.2、使用@A

    2024年02月03日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包