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

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

這篇具有很好參考價值的文章主要介紹了一文帶你了解Spring中存入Bean和獲取Bean的方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0. Spring中的五大注解

一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
上圖中就是五大類注解對應(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>

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

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 的名稱,就是原類名,這點可以看源碼知道
    一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java

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 getStudent(){
        Student student = new Student();
        student.setName("張三");
        student.setAge(18);
        return student;
    }
    public void say(){
        System.out.println("Hello User...");
    }
}

在上述代碼中,我們可以通過 在方法上 加上 @Bean 注解 將該方法存入到 IoC 容器中,并且可以直接獲取到該對象。
一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java


在使用 @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.11 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.12 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.13 Application VS BeanFactory

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

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

2.2 依賴注入(DI)

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

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

2.21 屬性注入

@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一個對象,直接獲得注入的對象。

缺點:

  1. 無法注入一個用 final 修飾的對象一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
    因為在Java語法中,final修飾的對象(不可變),要么一開始就賦值,要么在構(gòu)造方法里面賦值。而上述使用屬性注入,注入final修飾的對象,就不符合規(guī)范,所以不行。

  1. 只能適用于 IoC 容器:如果將這些代碼放到其他非IoC容器中,那么代碼就會失效
  2. 設(shè)計原則:更容易違背單一原則,因為屬性注入比較簡單,那么可能就會在一個類中注入多個對象,這就可能不符合程序的單一職責(zé)問題。

2.22 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容器
缺點:

  1. 不能注入 final 對象
    一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
  2. 由于是 Setter 注入,提供了 set 方法,那么注入的對象可以隨時被更改

2.23 構(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)點:

  1. 可以注入 被final 修飾的對象一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java

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

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

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

缺點:

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

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

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

一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
上述代碼,可以看到報錯,出現(xiàn)了多個同一類型的多個Bean報錯,需要1個,找到了2個。如何解決呢

  • 1.@Autowired 配合 @Qualifier(value = “xxx”)一起使用,里面參數(shù)加方法名字一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
  • 2.使用@Resource(name = “xxxx”)一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java

3. @Resource 和 @Autowired

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

  • 支持參數(shù)不同:@Resource支持更多的參數(shù)一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java
    @Autowired只支持一個參數(shù)設(shè)置

  • 使用上的區(qū)別:@Resource不支持構(gòu)造方法的注入
    一文帶你了解Spring中存入Bean和獲取Bean的方式,SSM,spring,java

  • 兼容性問題:@Autowired在社區(qū)版 IDEA可能會誤報;文章來源地址http://www.zghlxwxcb.cn/news/detail-595250.html


到了這里,關(guān)于一文帶你了解Spring中存入Bean和獲取Bean的方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【JavaEE】Spring中注解的方式去獲取Bean對象

    【JavaEE】Spring中注解的方式去獲取Bean對象

    【JavaEE】Spring的開發(fā)要點總結(jié)(3) 在前面的代碼里,我們獲取Bean對象也比較麻煩: 本文章就是為了更方便地去獲取Bean對象~ 對象裝配 也叫 對象注入 那么有沒有對應(yīng)的注解去實現(xiàn)這個功能呢? Spring提供的三種實現(xiàn)方法: 屬性注入 構(gòu)造方法注入 Setter注入 而這種非明文獲取

    2024年02月15日
    瀏覽(26)
  • Spring的加載配置文件、容器和獲取bean的方式

    Spring的加載配置文件、容器和獲取bean的方式

    ??個人主頁: ?? 葉落閑庭 ??我的專欄:?? c語言 數(shù)據(jù)結(jié)構(gòu) javaweb 石可破也,而不可奪堅;丹可磨也,而不可奪赤。 properties文件: jdbc.properties 1.開啟context命名空間 2.使用context命名空間,加載指定properties文件 3.使用屬性占位符 ${} 讀取properties文件中的屬性 properties文件

    2024年02月15日
    瀏覽(22)
  • Spring容器獲取Bean的9種方式 | 京東云技術(shù)團隊

    Spring容器獲取Bean的9種方式 | 京東云技術(shù)團隊

    隨著SpringBoot的普及,Spring的使用也越來越廣,在某些場景下,我們無法通過注解或配置的形式直接獲取到某個Bean。比如,在某一些工具類、設(shè)計模式實現(xiàn)中需要使用到Spring容器管理的Bean,此時就需要直接獲取到對應(yīng)的Bean。 本文為大家整理匯總了常見的獲取Bean的方式,并提

    2024年02月12日
    瀏覽(19)
  • spring(1):基于XML獲取Bean對象以及各種依賴注入方式

    1.1 根據(jù)id獲取 1.2 根據(jù)類型獲取 1.3 根據(jù)id和類型獲取 注意: 當(dāng)根據(jù)類型獲取bean時,要求IOC容器中指定類型的bean有且只能有一個。 例如以下XML文件,當(dāng)IOC容器中一共配置了兩個,根據(jù)類型獲取時會拋出異常。 根據(jù)類型來獲取bean時,在滿足bean唯一性的前提下,其實只是看:

    2024年01月25日
    瀏覽(56)
  • 【Spring學(xué)習(xí)】走進spring,spring的創(chuàng)建和使用,spring獲取Bean的幾種常見方式, ApplicationContext 和 BeanFactory的區(qū)別(重點面試)

    【Spring學(xué)習(xí)】走進spring,spring的創(chuàng)建和使用,spring獲取Bean的幾種常見方式, ApplicationContext 和 BeanFactory的區(qū)別(重點面試)

    前言: 大家好,我是 良辰丫 ,我們在上一篇文章不是簡單介紹了SpringBoot嘛,為什么不學(xué)習(xí)SpringBoot,而是要開始Spring呢?Spring是SpringBoot的前身,我們先學(xué)習(xí)以前的稍微復(fù)雜的框架,才能更好的學(xué)習(xí)SpringBoot.?????? ??個人主頁:良辰針不戳 ??所屬專欄:javaEE進階篇之框架學(xué)習(xí) ??勵志

    2024年02月08日
    瀏覽(24)
  • 一文帶你了解MySQL之鎖

    一文帶你了解MySQL之鎖

    上一篇文章主要學(xué)習(xí)了事務(wù)并發(fā)執(zhí)行時可能帶來的各種問題,并發(fā)事務(wù)訪問相同記錄的情況我們大致可以劃分為3種: 讀-讀 情況:即并發(fā)事務(wù)相繼讀取相同的記錄,我們需要知道的是讀取操作本身不會對記錄有一毛錢影響,并不會引起什么問題,所以允許這種情況的發(fā)生。

    2024年02月08日
    瀏覽(28)
  • 一文帶你了解動態(tài)內(nèi)存管理

    一文帶你了解動態(tài)內(nèi)存管理

    目錄 動態(tài)內(nèi)存存在的意義 動態(tài)內(nèi)存函數(shù)的介紹 malloc和free calloc realloc 常見的動態(tài)內(nèi)存錯誤 對NULL指針解引用操作 對動態(tài)開辟的空間的越界訪問 對非動態(tài)開辟內(nèi)存使用free釋放 使用free釋放一塊動態(tài)開辟內(nèi)存的一部分 對同一塊內(nèi)存多次釋放 動態(tài)開辟內(nèi)存忘記釋放 經(jīng)典的筆試題

    2024年02月16日
    瀏覽(18)
  • 一文帶你了解React框架

    一文帶你了解React框架

    前言 由于 React的設(shè)計思想極其獨特,屬于革命性創(chuàng)新,性能出眾,代碼邏輯卻非常簡單。所以,越來越多的人開始關(guān)注和使用,認(rèn)為它可能是將來 Web 開發(fā)的主流工具。 這個項目本身也越滾越大,從最早的UI引擎變成了一整套前后端通吃的 Web App 解決方案。衍生的 React Nativ

    2024年02月01日
    瀏覽(26)
  • 【MySQL】一文帶你了解數(shù)據(jù)過濾

    【MySQL】一文帶你了解數(shù)據(jù)過濾

    ?? 博客主頁:博主鏈接 ?? 本文由 M malloc 原創(chuàng),首發(fā)于 CSDN?? ?? 學(xué)習(xí)專欄推薦:LeetCode刷題集! ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! ?? 未來很長,值得我們?nèi)Ρ几案篮玫纳? ??大家好呀,今天是我第N次寫MySQL,也是最近才學(xué)習(xí)MySQL,也想著記錄

    2024年02月09日
    瀏覽(24)
  • 一文帶你了解MySQL之約束

    一文帶你了解MySQL之約束

    在SQL標(biāo)準(zhǔn)中,一共規(guī)定了6種不同的約束, 包括非空約束,唯一約束和檢查約束等,而在MySQL中是不支持檢查約束的,所以這篇文章先對其余5種約束做一個詳解和練習(xí)。 約束是作用于表中列上的規(guī)則,用于限制加入表的數(shù)據(jù)。 例如,作為主鍵的列一定是非空的唯一的,否則將

    2024年02月07日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包