精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

螞蟻一面:Spring 自動裝配的方式有哪些?

開發 前端
本文我們分析了 Spring 的自動裝配機制,并且通過例子展示了不同方式的自動裝配,自動裝配是 Spring的核心功能,建議大家掌握原理。?

自動裝配是 Spring的一大核心功能,那么,Spring的自動裝配有哪些方式?它們又是如何裝配的呢?這篇文章,我們一起來探索一道螞蟻的面試題:Spring 自動裝配的方式有哪些?

一、什么是自動裝配?

在傳統的 Java 應用中,我們常常需要手動創建和管理對象的依賴關系。這不僅麻煩,還容易出錯。Spring 的自動裝配功能,旨在通過自動識別和注入依賴,簡化開發流程,提高代碼的可維護性。

簡單來說,自動裝配就是讓 Spring 自動完成對象之間的依賴關系注入,減少手動配置的工作量。

二、自動裝配的幾種方式

Spring 提供了多種自動裝配的方式,每種方式都有其適用的場景。接下來,我們逐一介紹。

1. 按類型裝配(By Type)

按類型裝配通過匹配屬性的類型,自動為屬性注入合適的 Bean。

特點:

  • 簡單易用
  • 依賴類型必須唯一,避免沖突

示例:

假設我們有一個 UserService 接口及其實現 UserServiceImpl,以及一個 UserController 需要注入 UserService。

// UserService.java
publicinterface UserService {
    void registerUser();
}

// UserServiceImpl.java
@Service
publicclass UserServiceImpl implements UserService {
    @Override
    public void registerUser() {
        System.out.println("用戶注冊成功!");
    }
}

// UserController.java
@Controller
publicclass UserController {
    @Autowired
    private UserService userService;

    public void createUser() {
        userService.registerUser();
    }
}

在這個例子中,UserController 通過 @Autowired 注解,按類型自動裝配了 UserService 的實現類 UserServiceImpl。

2. 按名稱裝配(By Name)

按名稱裝配則是通過屬性名匹配 Bean 的名稱來進行注入。

特點:

  • 需要 Bean 名稱與屬性名一致
  • 適用于有多個同類型 Bean 的情況

示例:

假設我們有兩個 UserService 的實現:

// EmailUserService.java
@Service("emailUserService")
publicclass EmailUserService implements UserService {
    @Override
    public void registerUser() {
        System.out.println("通過電子郵件注冊用戶!");
    }
}

// SmsUserService.java
@Service("smsUserService")
publicclass SmsUserService implements UserService {
    @Override
    public void registerUser() {
        System.out.println("通過短信注冊用戶!");
    }
}

// UserController.java
@Controller
publicclass UserController {
    // 這里的屬性名需要與 Bean 名稱匹配
    @Autowired
    @Qualifier("emailUserService")
    private UserService userService;

    public void createUser() {
        userService.registerUser();
    }
}

在這個例子中,通過 @Qualifier 注解指定了 emailUserService,確保了按名稱裝配。

3. 構造器裝配(Constructor)

構造器裝配通過構造方法來注入依賴,適合于需要強制依賴的場景。

特點:

  • 適用于不可變對象
  • 有助于編寫測試代碼

示例:

// UserServiceImpl.java
@Service
publicclass UserServiceImpl implements UserService {
    @Override
    public void registerUser() {
        System.out.println("用戶注冊成功!");
    }
}

// UserController.java
@Controller
publicclass UserController {
    privatefinal UserService userService;

    // 構造方法注入
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public void createUser() {
        userService.registerUser();
    }
}

通過構造器注入,確保 UserController 在創建時必定擁有一個 UserService 實例。

4. 使用 @Autowired 注解

@Autowired 是 Spring 提供的注解,用于標注需要自動裝配的屬性、構造器或方法。

特點:

  • 靈活性高
  • 支持按類型、按名稱及構造器注入

示例:

除了之前的示例,@Autowired 還可以用于方法注入:

// UserController.java
@Controller
public class UserController {
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void createUser() {
        userService.registerUser();
    }
}

這種方式通過 setter 方法進行依賴注入,提高了代碼的可測試性。

三、自動裝配的原理解析

理解了自動裝配的各種方式,接下來我們來看看背后的原理。

Spring 的自動裝配主要依賴于 依賴注入(Dependency Injection, DI) 的概念。容器在啟動時,會掃描配置的 Bean,通過反射和代理機制,將需要的依賴注入到目標對象中。

具體來說,當 Spring 容器發現一個 Bean 被標注了 @Autowired,它會:

  • 檢索容器中所有符合類型或名稱的 Bean。
  • 根據裝配策略(按類型、按名稱或構造器)選擇合適的 Bean。
  • 將選中的 Bean 注入到目標對象的相應屬性或構造器參數中。

如果容器中存在多個符合條件的 Bean,Spring 會嘗試通過 @Qualifier 或默認的 Bean 名稱來區分,否則會拋出異常。

四、示例

讓我們通過一個簡單的項目,實戰演練一下 Spring 的自動裝配。

項目結構:

src
├── main
│   ├── java
│   │   └── com.example.autowiring
│   │       ├── Application.java
│   │       ├── controller
│   │       │   └── UserController.java
│   │       ├── service
│   │       │   ├── UserService.java
│   │       │   └── UserServiceImpl.java
│   └── resources
│       └── applicationContext.xml

1. 定義服務接口和實現

// UserService.java
package com.example.autowiring.service;

publicinterface UserService {
    void registerUser();
}

// UserServiceImpl.java
package com.example.autowiring.service;

import org.springframework.stereotype.Service;

@Service
publicclass UserServiceImpl implements UserService {
    @Override
    public void registerUser() {
        System.out.println("用戶注冊成功!");
    }
}

2. 定義控制器

// UserController.java
package com.example.autowiring.controller;

import com.example.autowiring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
publicclass UserController {
    // 自動裝配 UserService
    @Autowired
    private UserService userService;

    public void createUser() {
        userService.registerUser();
    }
}

3. 配置 Spring 容器

<!-- applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans     
           https://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 開啟自動掃描 -->
    <context:component-scan base-package="com.example.autowiring"/>

</beans>

4. 啟動應用

// Application.java
package com.example.autowiring;

import com.example.autowiring.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

publicclass Application {
    public static void main(String[] args) {
        // 加載 Spring 配置
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 獲取 UserController Bean
        UserController userController = context.getBean(UserController.class);

        // 調用方法
        userController.createUser();
    }
}

5. 運行結果

執行 Application.main() 方法后,控制臺會輸出:

用戶注冊成功!

這說明 UserController 成功地從 Spring 容器中自動裝配了 UserServiceImpl,并調用了其 registerUser 方法。

五、常見問題與優化建議

1. 多個 Bean 沖突

當容器中存在多個相同類型的 Bean 時,按類型裝配會導致沖突。解決方法包括:

  • 使用 @Qualifier 指定具體的 Bean 名稱。
  • 使用 @Primary 標注一個默認的 Bean。

示例:

@Service
@Primary
publicclass PrimaryUserServiceImpl implements UserService {
    @Override
    public void registerUser() {
        System.out.println("主用戶服務實現!");
    }
}

@Service
publicclass SecondaryUserServiceImpl implements UserService {
    @Override
    public void registerUser() {
        System.out.println("次級用戶服務實現!");
    }
}

// UserController.java
@Autowired
private UserService userService; // 將注入 PrimaryUserServiceImpl

2. 循環依賴

如果兩個 Bean 互相依賴,Spring 默認會嘗試解決循環依賴,但有時會失敗。避免循環依賴的最佳實踐是:

  • 重構代碼,減少 Bean 之間的緊耦合。
  • 使用 @Lazy 注解延遲加載 Bean。

六、總結

本文,我們分析了 Spring 的自動裝配機制,并且通過例子展示了不同方式的自動裝配,自動裝配是 Spring的核心功能,建議大家掌握原理。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2025-03-28 08:10:00

Spring自動裝配Java

2022-05-10 08:11:15

MySQL技巧結構

2022-05-11 15:57:16

優化SQL

2025-04-15 08:00:00

Java開發服務網格

2024-10-17 16:58:43

2024-11-01 06:00:00

2025-05-15 09:45:54

2025-03-24 07:35:00

開發注解Spring

2024-10-15 10:59:18

Spring MVCJava開發

2022-04-02 10:52:33

Go開發面試

2025-03-20 09:59:55

Spring@ProfileJava

2022-05-11 22:15:51

云計算云平臺

2020-09-19 17:46:20

React Hooks開發函數

2009-07-30 14:38:36

云計算

2011-12-23 09:43:15

開源開放

2011-12-22 20:53:40

Android

2025-03-25 12:00:00

@Value?Spring開發

2024-05-15 16:41:57

進程IO文件

2025-03-18 08:30:00

Spring開發java

2025-03-13 10:01:47

點贊
收藏

51CTO技術棧公眾號

日韩性xxxx| 久久久久久久极品内射| 日本国产欧美| 日本一区二区三区四区在线视频| 国产精品视频免费在线| 欧美精品入口蜜桃| 亚洲国产国产| 制服丝袜亚洲色图| 欧美色图色综合| 男女啪啪在线观看| 成人激情黄色小说| 国产精品一区专区欧美日韩| 精品无码一区二区三区电影桃花| 精品高清久久| 精品999在线播放| 美女网站视频黄色| a级片免费在线观看| 欧美激情一区二区三区在线| 国产精品入口免费| 在线免费观看日韩视频| 亚洲视频大全| 欧美xxxx18国产| 亚洲色成人网站www永久四虎 | 亚洲品质自拍视频网站| 久久综合狠狠综合久久综青草| 国产麻豆免费观看| 人人爽香蕉精品| 欧美一级在线播放| 日本中文字幕免费观看| 欧美日韩亚洲三区| 久久人人爽亚洲精品天堂| 人人妻人人澡人人爽| 欧美大胆视频| 精品国产成人在线影院| 亚洲一区二区福利视频| 国产一区影院| 欧美性大战xxxxx久久久| 激情综合在线观看| av2020不卡| 亚洲影视在线观看| 女人床在线观看| 成人在线观看亚洲| 亚洲特级片在线| 亚洲一卡二卡| 无遮挡动作视频在线观看免费入口| 国产婷婷精品av在线| 久久综合色一本| 天堂中文在线8| gogo大胆日本视频一区| 国产精品区一区二区三在线播放| www.国产.com| 国产69精品久久777的优势| 91精品中文在线| 国产男男gay体育生网站| 久久99精品久久久久久| 国产欧美 在线欧美| 一本色道久久综合熟妇| 久久精品国产精品亚洲红杏| 国产精品私拍pans大尺度在线| 欧美在线视频精品| 麻豆精品一区二区| 91久久久久久久久久| 国产伦精品一区二区三区四区| 久久99国产精品久久99果冻传媒| 国产人妖伪娘一区91| 国产精品毛片久久久久久久av| 久久99久久久久| 成人av片网址| 亚洲色图狠狠干| 久久精品视频一区二区三区| 欧洲视频一区二区三区| av在线免费观看网| 亚洲日本丝袜连裤袜办公室| 中文字幕在线中文| 国产在线精彩视频| 色综合久久久网| 中文字幕精品一区二区三区在线| 嫩呦国产一区二区三区av| 精品乱人伦小说| 无码人妻aⅴ一区二区三区| 国产一区二区三区日韩精品 | 久久日韩精品| 在线观看国产原创自拍视频| 国产精品不卡在线| 日韩精品在线观看av| 国产精品迅雷| 5858s免费视频成人| 久久人妻少妇嫩草av无码专区| 免费久久精品| 久久精品视频在线| 日本一二三区不卡| 久久国产人妖系列| 国产亚洲欧美另类一区二区三区| 福利片在线看| 亚洲777理论| 网站一区二区三区| 国产suv精品一区| 中文字幕欧美视频在线| 久久精品欧美一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 国产成人看片| 久久久久久国产精品免费无遮挡| 亚洲福利国产精品| jizzzz日本| 日韩大胆成人| 欧美日韩国产成人| 中文字幕在线观看精品| 99久久99久久综合| 成人短视频在线看| 天然素人一区二区视频| 精品国产伦理网| 永久免费看mv网站入口| 日日骚欧美日韩| 国产精品我不卡| caopen在线视频| 欧美视频在线不卡| 亚洲国产精品成人综合久久久| 亚洲国产成人精品女人| 国产精品久久久久久久av电影| 乱精品一区字幕二区| 综合色天天鬼久久鬼色| 日本爱爱免费视频| 亚洲国产最新| 亚州精品天堂中文字幕| 精品人妻一区二区三区三区四区| 国产精品欧美经典| 青青在线视频免费| 日韩欧美四区| 1769国产精品| 色呦呦视频在线| 亚洲黄色在线视频| 手机免费看av网站| 久久一区二区中文字幕| 国产精品电影网站| 国产天堂素人系列在线视频| 大桥未久av一区二区三区| 亚洲av永久无码精品| 欧美午夜不卡| 懂色一区二区三区av片| 蜜桃成人365av| 日韩精品一区二区在线观看| 日本妇女毛茸茸| 国产一区二区在线免费观看| 中文字幕中文字幕一区三区| 久久久久久久性潮| 中文字幕在线成人| 亚洲天堂网在线视频| 亚洲国产精品成人久久综合一区| 成年人在线看片| 教室别恋欧美无删减版| 日本国产一区二区三区| 高清美女视频一区| 欧美日韩国产精品成人| 欧美一级特黄高清视频| 国内精品自线一区二区三区视频| 国产成人免费高清视频| 综合激情网...| 5252色成人免费视频| 免费黄色在线视频网站| 在线观看国产日韩| 日韩欧美在线视频播放| 韩国欧美国产1区| 国产成人永久免费视频| 久久久免费毛片| 人九九综合九九宗合| 搞黄视频在线观看| 91精品国产品国语在线不卡| 久久久久久久久99| 99精品久久久久久| 亚洲一区在线不卡| 在线精品视频在线观看高清| eeuss一区二区三区| 免费h在线看| 中文字幕日韩av综合精品| 国产又粗又大又爽视频| 亚洲综合在线五月| 中文字幕国产综合| 激情综合亚洲精品| 男人日女人逼逼| 成人一区二区| 99re资源| 亚洲成人激情社区| 美女久久久久久久久久久| 视频一区二区免费| 欧美午夜宅男影院| 久久这里只有精品免费| 久久久久久久综合色一本| 91小视频在线播放| 免费日韩av片| 黄色免费高清视频| 欧美人体视频| 91久久精品一区| 黄色亚洲网站| 欧美乱妇高清无乱码| 毛片在线播放网址| 日韩一区二区麻豆国产| 中文字幕第四页| 亚洲视频一二区| 性高潮久久久久久久| 国产成人精品一区二| 亚洲黄色a v| 99精品国产在热久久婷婷| 亚洲欧洲中文| 亚洲瘦老头同性70tv| 亚洲最大av在线| 粉嫩91精品久久久久久久99蜜桃 | 亚洲激情自拍图| 91久久国语露脸精品国产高跟| 欧美日韩国产在线播放| 国产激情无码一区二区三区| 久久午夜老司机| caopor在线| 激情六月婷婷综合| 午夜精品在线免费观看| 亚洲欧美日韩精品一区二区| 超碰人人爱人人| 999国产精品视频| 欧美在线播放一区| 久久香蕉精品香蕉| 99在线视频首页| www.欧美视频| 国产欧美一区二区白浆黑人| 九九九伊在线综合永久| 欧洲成人免费视频| av福利在线导航| 久久久久久久一| 手机在线免费观看av| 精品国产一区二区三区久久狼5月| 国产一区精品| 亚洲欧美999| 日中文字幕在线| 日韩h在线观看| 天堂在线观看免费视频| 亚洲成人久久久久| 免费观看黄色av| 欧美成人video| 性中国古装videossex| 欧美一卡2卡3卡4卡| 国产麻豆精品一区| 91精品国产欧美一区二区| 国产视频手机在线| 91精品福利在线一区二区三区 | 在线中文字幕日韩| a√资源在线| 中文精品99久久国产香蕉| 成年人在线观看网站| 国产亚洲精品久久久久久777| 黄色在线小视频| 中文字幕日韩精品在线| 18视频免费网址在线观看| 中文字幕9999| 毛片在线视频| 欧美大胆在线视频| 国产网红女主播精品视频| 久久久久久久久久久av| wwwwxxxx在线观看| 欧美亚洲另类制服自拍| **在线精品| 国产精品日韩欧美综合| 亚洲男女网站| 91成人免费视频| 久久动漫网址| 日本a级片久久久| 99久久99久久精品国产片果冰| av不卡在线免费观看| 欧美日韩免费观看一区=区三区| www.av片| 蜜芽一区二区三区| 欧美老女人bb| 99re这里都是精品| 人成免费在线视频| 亚洲欧美日韩国产成人精品影院 | 免费精品视频| 嫩草影院国产精品| 国产成人三级在线观看| 欧美一区二区三区成人精品| 国产精品视频一二三| 国产精品老熟女一区二区| 亚洲小说欧美激情另类| 无码人妻熟妇av又粗又大| 欧美精品日日鲁夜夜添| 色婷婷激情五月| 日韩一区二区三区国产| 岛国在线视频网站| 成人久久精品视频| 精品国产午夜肉伦伦影院| 日韩精品国内| 欧美三级黄美女| 91精品无人成人www| 成人激情小说乱人伦| 亚洲黄色免费视频| 亚洲一区二区三区在线| 国产精品无码一区| 精品国产一区二区三区不卡| 国产黄在线看| 久久久视频在线| 91精品店在线| 精品人伦一区二区三区| 亚洲中无吗在线| 蜜臀av午夜一区二区三区| 福利电影一区二区三区| 国产在线免费av| 精品国产91久久久久久老师| 国产美女精品视频国产| 一区二区三区 在线观看视| 激情影院在线| 成人av色在线观看| 神马电影久久| www在线观看免费| 国产精品一区二区在线观看不卡| 欧美波霸videosex极品| 精品久久久久久久久久久| 99热这里只有精品5| 在线丨暗呦小u女国产精品| 中文字幕高清在线播放| 成人免费看片网址| 亚洲91视频| 色播五月综合网| 久久久久99精品一区| 好吊操这里只有精品| 精品久久一二三区| 国产原厂视频在线观看| 国产精品一区二区三区久久久| 亚洲+变态+欧美+另类+精品| 久久av综合网| 国产福利电影一区二区三区| 在线免费看av网站| 欧美日韩国产综合视频在线观看| 久久99久久| 日韩美女视频免费看| 最近国产精品视频| 蜜桃传媒一区二区三区| 成人免费视频一区| 久久精品女人毛片国产| 精品国产精品网麻豆系列| 国产在线xxx| 国产成人免费观看| 亚洲视屏一区| 一级特黄a大片免费| 午夜精品久久久久久久99水蜜桃 | 91精品国产自产在线丝袜啪| 亚洲五码在线观看视频| 国产精品一区二区三区乱码| 亚洲深夜福利在线| 久久人人爽人人| 欧美综合视频在线| 色综合视频网站| 精品中文在线| 国产一级黄色录像片| 国产剧情一区在线| 免费在线视频观看| 欧美变态凌虐bdsm| 1区2区3区在线| 久久99久久99精品蜜柚传媒| 一区二区三区四区五区精品视频 | 国产一区二区久久久久| 天天干天天色天天爽| 国产精品12区| 国产精品不卡av| 国产视频精品va久久久久久| 电影一区二区三区| 亚洲a∨一区二区三区| 狠狠狠色丁香婷婷综合激情| 99自拍视频在线| 日韩精品一区在线| 欧美freesex黑人又粗又大| 欧洲精品码一区二区三区免费看| 免费看日韩精品| 精品国产精品国产精品| 日韩欧美高清dvd碟片| 第一福利在线视频| 欧洲亚洲一区二区三区四区五区| 美腿丝袜在线亚洲一区| 欧美成人手机视频| 亚洲激情在线视频| 成人在线观看免费播放| 手机看片日韩国产| 91丨九色porny丨蝌蚪| 欧美性受xxx黑人xyx性爽| 久久躁狠狠躁夜夜爽| 风间由美中文字幕在线看视频国产欧美 | 五月婷婷狠狠干| 国产精品96久久久久久| 欧美gvvideo网站| 性欧美18—19sex性高清| 色综合久久综合网97色综合| 暖暖日本在线观看| 黄色91av| 激情图片小说一区| 日本三级免费看| 日韩在线观看网站| 加勒比久久高清| 欧美日韩一区二区三区69堂| 亚洲一区在线电影| 91在线视频| 久久99精品久久久久子伦| 国产在线观看一区二区| 欧美黑人一区二区| 九九热r在线视频精品| 精品国产一级毛片|