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

一文帶你了解Spring中存入Bean和獲取Bean的方式

 更新時間:2023年07月20日 09:50:14   作者:一個想打拳的程序員  
這篇文章主要帶大家了解Spring中存入Bean和獲取Bean的方式,文中的代碼示例講解的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

0. Spring中的五大注解

上圖中就是五大類注解對應(yīng)的層,通過源碼可以看到其他四個注解都基于@Conponent

1. 存入 Bean

Spring既然是一個包含眾多工具方法的IoC容器,它是一個控制反轉(zhuǎn)的容器,所以就需要將Bean對象存入到容器中,需要用的時候從容器中獲取Bean對象,下面我們來介紹下存入Bean對象。

1.1 在 xml 中存入 Bean 對象

<?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">
   // 這句代碼中, id 就是給 這個要注入的對象取個名字, class就是 要存入的 Bean 的類型是哪一個
    <bean id = "user" class="com.java.demo.User"></bean>
</beans>

1.2 通過配置 Bean 掃描路徑 + 類注解 實現(xiàn) Bean 的存儲

<?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.java.demo"></content:component-scan>
</beans>

配置了 Bean 的掃描路徑,只有當(dāng)前目錄下的類才會被掃描是否加了類注解,如果加了類注解后,就會將 所有加了類注解的類 存入到 IoC容器中。

@Component
public class User {
    public void say(){
        System.out.println("Hello User...");
    }
}

類注解存Bean需要注意幾點

  • 如果類名為大駝峰命名規(guī)則,那么獲取 Bean 的默認(rèn)名稱,就是 類名首字母小寫
  • 如果不滿足首字母大寫,第二個字母小寫,那么 Bean 的名稱,就是原類名,這點可以看源碼知道

1.3 通過配置 Bean 掃描路徑 + 方法注解 實現(xiàn) Bean 的存儲

<?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.java.demo"></content:component-scan>
</beans>
public class Student {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
@Component
public class User {
    @Bean
    public Student student(){
        Student student = new Student();
        student.setName("張三");
        student.setAge(18);
        return student;
    }
    public void say(){
        System.out.println("Hello User...");
    }
}

在上述代碼中,我們可以通過 在方法上 加上 @Bean 注解 將該方法存入到 IoC 容器中,并且可以直接獲取到該對象。

在使用 @Bean 注解的時候,需要注意幾點

  • @Bean 注解必須配合 五大類注解一塊使用
  • @Bean 注解的默認(rèn)命名 = 方法名稱
  • 如果使用 @Bean(“xxxx”)方式,那么名稱就是 xxxx, 并且 @Bean({“xxx”,“xxxxx”,“xxxxxx”}),里面可以類似和數(shù)組一樣多個名稱
  • 如果@Bean重命名后,那么默認(rèn)的方法名就沒用,獲取Bean的時候就不能寫默認(rèn)方法名
  • 如果多個 Bean 使用相同的名稱,則不會報錯,只會存儲第一個 Bean對象,之后相同名稱的不會存入,會自動忽略

2. 獲取 Bean

2.1 依賴查找(DF)

依賴查找(依賴Bean的名稱),有兩種方式,一種是 ApplicationContext, 一種是 BeanFactory。這兩種都是容器管理對象,都可以獲取到 Bean對象

2.1.1 ApplicationContext

public class App {
    public static void main(String[] args) {
        // 1. 獲取 Spring 上下文對象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2。獲取 Bean 對象
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }
}

2.1.2 BeanFactory

    public static void main(String[] args) {
        // 1. 得到 spring 上下文對象
        BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 2. 獲取 Bean 對象
        //Student student = (Student)context.getBean("user");
        Student student = (Student)context.getBean("student");
        System.out.println(student.toString());
    }

2.1.3 Application VS BeanFactory

ApplicationContextBeanFactory
ApplicationContext是BeanFactory的子類,其擁有更多功能(國際化支持、資源訪問支持、事件傳播)BeanFactory是ApplicationContext的父類
ApplicationContext加載Bean:一次性加載所有Bean對象BeanFactory加載Bean:懶加載,按需加載(使用一個加載一個)

2.2 依賴注入(DI)

在 spring 中實現(xiàn)依賴注入的常見方式有3種:

  • 1.屬性注入
  • 2.setter注入
  • 3.構(gòu)造方法注入

2.2.1 屬性注入

@Controller
public class UserController {
    /**
     * 屬性注入
     */
    @Autowired
    private UserService userService;
    // 此處 main方法里面,必須使用依賴查找的方式,先獲取到UserController
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController = (UserController) context.getBean("userController");
        userController.userService.say();
    }
}

屬性注入:

優(yōu)點: 實現(xiàn)簡單、使用簡單,只需要在屬性上加一個注解@Autowired,就不需要自己new一個對象,直接獲得注入的對象。

缺點:

  • 無法注入一個用 final 修飾的對象

  •  因為在Java語法中,final修飾的對象(不可變),要么一開始就賦值,要么在構(gòu)造方法里面賦值。而上述使用屬性注入,注入final修飾的對象,就不符合規(guī)范,所以不行。
  • 只能適用于 IoC 容器:如果將這些代碼放到其他非IoC容器中,那么代碼就會失效
  • 設(shè)計原則:更容易違背單一原則,因為屬性注入比較簡單,那么可能就會在一個類中注入多個對象,這就可能不符合程序的單一職責(zé)問題。

2.2.2 Setter注入

@Controller
public class UserController2 {
    private UserService userService;
    /**
     * setter注入
     */
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController2 userController2 = (UserController2) context.getBean("userController2");
        userController2.userService.say();
    }
}

優(yōu)點:似乎沒什么優(yōu)點,而且比屬性注入更加麻煩,要說唯一可能有用的就是,完全符合單一職責(zé)設(shè)計原則,每個 setter 只針對一個對象。Setter注入 也適用于非IoC容器
缺點:

  • 不能注入 final 對象

  • 由于是 Setter 注入,提供了 set 方法,那么注入的對象可以隨時被更改

2.2.3 構(gòu)造方法注入(Spring4.x之后推薦的)

@Controller
public class UserController3 {
    private final UserService userService;
    /**
     * 構(gòu)造方法注入
     */
    // @Autowired 此處如果構(gòu)造方法參數(shù)只有一個的時候,該注解可有可無
    public UserController3(UserService userService) {
        this.userService = userService;
    }
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController3 userController3 = (UserController3) context.getBean("userController3");
        userController3.userService.say();
    }
}

優(yōu)點:

  • 可以注入 被final 修飾的對象

  • 注入對象不會被更改,因為是在構(gòu)造方法注入的,構(gòu)造方法在對象創(chuàng)建的時候只會創(chuàng)建一次

  • 注入的對象會被完全初始化

  • 通用性會更好,無論在 IoC容器 還是 非 IoC容器中都能用

缺點:

  • 寫法更加復(fù)雜
  • 使用構(gòu)造方法,無法解決循環(huán)依賴的問題

Spring官方推薦的是構(gòu)造方法的注入,可以注入不可變對象,通用性更好;如果想要注入可變對象,那么可以使用 Setter 注入。

3. 解決同一類型多個 Bean 的報錯問題

上述代碼,可以看到報錯,出現(xiàn)了多個同一類型的多個Bean報錯,需要1個,找到了2個。如何解決呢

  • 1.@Autowired 配合 @Qualifier(value = “xxx”)一起使用,里面參數(shù)加方法名字

  • 2.使用@Resource(name = “xxxx”)

4. @Resource 和 @Autowired

  • 出身不同:@Resource來自于JDK,@Resource來自于Spring

  • 支持參數(shù)不同:@Resource支持更多的參數(shù)

  • @Autowired只支持一個參數(shù)設(shè)置

  • 使用上的區(qū)別:@Resource不支持構(gòu)造方法的注入

  • 兼容性問題:@Autowired在社區(qū)版 IDEA可能會誤報;

以上就是一文帶你了解Spring中存入Bean和獲取Bean的方式的詳細(xì)內(nèi)容,更多關(guān)于Spring存入和獲取Bean方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JWT登錄認(rèn)證Springboot詳解

    JWT登錄認(rèn)證Springboot詳解

    文章主要介紹了如何在Java項目中使用JWT進(jìn)行用戶認(rèn)證和授權(quán),通過定義一個常量,編寫JWT工具類來生成和解析token,登錄時在服務(wù)端生成token并返回給客戶端,客戶端使用攔截器攔截請求,驗證token的有效性,從而實現(xiàn)權(quán)限控制,文章旨在分享個人經(jīng)驗,為開發(fā)者提供參考
    2024-11-11
  • SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例

    SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例

    這篇文章主要為大家介紹了SpringBoot開發(fā)在啟動時自動配置校驗的實現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • SpringCloud版本問題報錯及解決方法

    SpringCloud版本問題報錯及解決方法

    這篇文章主要介紹了SpringCloud版本問題報錯及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 關(guān)于jpa中無法刪除onetomany中many問題的解決

    關(guān)于jpa中無法刪除onetomany中many問題的解決

    這篇文章主要介紹了關(guān)于jpa中無法刪除onetomany中many問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用EasyExcel實現(xiàn)百萬級別數(shù)據(jù)導(dǎo)出的代碼示例

    使用EasyExcel實現(xiàn)百萬級別數(shù)據(jù)導(dǎo)出的代碼示例

    近期需要開發(fā)一個將百萬數(shù)據(jù)量MySQL8的數(shù)據(jù)導(dǎo)出到excel的功能,所以本文講給大家介紹了基于EasyExcel實現(xiàn)百萬級別數(shù)據(jù)導(dǎo)出,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Spring Cloud 請求重試機制核心代碼分析

    Spring Cloud 請求重試機制核心代碼分析

    這篇文章主要介紹了Spring Cloud 請求重試機制核心代碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • mybatis類型轉(zhuǎn)換器如何實現(xiàn)數(shù)據(jù)加解密

    mybatis類型轉(zhuǎn)換器如何實現(xiàn)數(shù)據(jù)加解密

    這篇文章主要介紹了mybatis類型轉(zhuǎn)換器如何實現(xiàn)數(shù)據(jù)加解密,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Hibernate中獲取Session的兩種方式代碼示例

    Hibernate中獲取Session的兩種方式代碼示例

    這篇文章主要介紹了Hibernate中獲取Session的兩種方式代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • java中forward轉(zhuǎn)發(fā)的使用

    java中forward轉(zhuǎn)發(fā)的使用

    在Java中,forward轉(zhuǎn)發(fā)是一種非常常見且重要的操作,我們將深入探討forward的概念和用法,并給出一些代碼示例來幫助讀者更好地理解,感興趣的可以了解下
    2023-11-11

最新評論

梅州市| 邳州市| 盐山县| 桂林市| 宽城| 敖汉旗| 德惠市| 沾化县| 将乐县| 胶州市| 芦溪县| 巴林右旗| 邓州市| 定南县| 溧水县| 浦县| 平泉县| 安福县| 花垣县| 德令哈市| 濮阳市| 昌都县| 额敏县| 平果县| 兴仁县| 南江县| 晋江市| 偃师市| 三台县| 衡山县| 辉县市| 定襄县| 马龙县| 唐河县| 乳源| 海阳市| 康平县| 安岳县| 新野县| 寿宁县| 砚山县|