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

螞蟻一面: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-05-22 09:54:06

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開發面試

2022-05-11 22:15:51

云計算云平臺

2025-03-20 09:59:55

Spring@ProfileJava

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

2024-05-15 16:41:57

進程IO文件

2025-03-25 12:00:00

@Value?Spring開發

2025-03-18 08:30:00

Spring開發java

2025-03-13 10:01:47

點贊
收藏

51CTO技術棧公眾號

亚洲精品欧美激情| 久久成人免费网| 亚洲精品在线不卡| 中日韩av在线播放| 丰满诱人av在线播放| 91一区一区三区| 国产精品美女av| 欧美成人一二三区| 国产精品欧美在线观看| 欧美一区在线视频| 欧美精品色婷婷五月综合| 日韩精品黄色| 91一区在线观看| 亚洲综合中文字幕在线| 久久精品视频1| 欧美激情综合色综合啪啪| 亚洲三级黄色在线观看| 无码人妻久久一区二区三区蜜桃| 中文字幕高清在线播放| 亚洲乱码精品一二三四区日韩在线| 久久精品日产第一区二区三区 | 一本在线免费视频| 成人影院中文字幕| 欧美三级三级三级| 国产3p露脸普通话对白| 免费黄色在线| 久久亚洲精品小早川怜子| 2019国产精品视频| 在线观看xxxx| 老司机久久99久久精品播放免费| 九九精品在线视频| 亚洲区一区二区三| 欧美热在线视频精品999| 精品福利在线导航| 亚洲欧美日韩一二三区| 91另类视频| 日本大香伊一区二区三区| 婷婷五月综合缴情在线视频| h视频在线免费观看| 亚洲国产精品av| 欧美精品欧美精品系列c| 国产小视频一区| 国产成人日日夜夜| 亚洲最大成人在线| 99er热精品视频| 经典三级在线一区| 91精品国产自产在线| 中文字幕免费高清网站| 亚洲自拍另类| 69久久夜色精品国产69乱青草| 青娱乐在线视频免费观看| 亚洲国产老妈| 久久的精品视频| 黑鬼狂亚洲人videos| 欧美电影一区| 久久亚洲精品毛片| 亚洲一二三在线观看| 91视频综合| 精品国产欧美一区二区五十路| 纪美影视在线观看电视版使用方法| 精品99在线| 中文字幕日韩视频| 一本色道久久88| 午夜欧美在线| 欧美日韩成人精品| 日韩精品在线不卡| 国产视频一区免费看| 热久久免费视频精品| 亚洲av无码不卡| 精品一区二区日韩| av一区二区三区四区电影| 成人久久久精品国产乱码一区二区| 国产成人在线影院 | 亚洲国产成人一区二区| 成人的网站免费观看| 国产一区自拍视频| 欧美视频综合| 国产精品国产精品国产专区不蜜| 一卡二卡3卡四卡高清精品视频| 午夜激情在线观看| 一区二区三区高清| 日本www在线播放| 国内自拍亚洲| 日韩精品在线网站| 一区二区三区免费在线观看视频 | 少妇太紧太爽又黄又硬又爽| 丝袜美腿亚洲一区| 成人国产在线视频| 成人免费视频国产| 亚洲国产精品ⅴa在线观看| 91大学生片黄在线观看| 韩日毛片在线观看| 欧美三级中文字幕| 亚洲国产精品狼友在线观看| 美日韩中文字幕| 日韩视频欧美视频| 午夜毛片在线观看| 国产一区二区三区免费观看| 国产一区精品在线| 男人在线资源站| 精品久久久久国产| 制服丝袜中文字幕第一页| 国内自拍欧美| 久久精品国产电影| 亚洲精品国产精品乱码| 蓝色福利精品导航| 九色综合日本| 超碰porn在线| 欧美性videosxxxxx| 国产在线不卡av| 91综合久久| 国产福利精品视频| 成人毛片在线精品国产| 中文字幕在线一区二区三区| ww国产内射精品后入国产| 伊人亚洲精品| 一区二区亚洲精品国产| 国产精品suv一区二区| 久久99精品久久久久久国产越南| 久久这里精品国产99丫e6| 亚洲七七久久综合桃花剧情介绍| 一本久久a久久精品亚洲| 国产污在线观看| 99久久夜色精品国产亚洲狼| 青青青国产精品一区二区| 懂色av蜜臀av粉嫩av分享吧| 亚洲欧美视频一区| 波多野结衣xxxx| 杨幂一区二区三区免费看视频| 欧美猛交免费看| 国产精品欧美亚洲| 国产精品视频你懂的| 欧美成人精品欧美一级乱| 欧美激情三级| 欧美久久久精品| 国产成人a人亚洲精品无码| 国产欧美一区视频| 欧美 激情 在线| 日韩av午夜| 97视频在线观看播放| www.天堂在线| 一区二区三区免费观看| 五月天婷婷在线观看视频| 色欧美自拍视频| 国产日本欧美一区二区三区| 日本在线视频网| 欧美人妖巨大在线| 在线观看亚洲网站| 久久国产精品区| 免费看啪啪网站| 99精品国产九九国产精品| 久久久极品av| 99国产揄拍国产精品| 亚洲人成亚洲人成在线观看图片 | 伦av综合一区| 国产亚洲成aⅴ人片在线观看| 无码无遮挡又大又爽又黄的视频| 色婷婷综合久久久久久| 欧洲成人免费视频| 国产视频精选在线| 欧美日韩精品欧美日韩精品一综合| 亚洲毛片亚洲毛片亚洲毛片| 精品影院一区二区久久久| 一本色道久久88亚洲精品综合| 国产一区二区三区免费观看在线 | 国产精品视频免费播放| 91视频观看免费| 91淫黄看大片| 99国产精品免费视频观看| 91老司机在线| 操喷在线视频| 亚洲天堂网在线观看| 亚洲在线免费观看视频| 亚洲激情男女视频| 免费a v网站| 久久精品首页| 影音先锋欧美在线| 色播一区二区| 日本精品久久电影| 日本不卡三区| 亚洲第一精品福利| 五月婷婷丁香在线| 亚洲精品视频在线观看免费| 国产成人精品无码片区在线| 日韩和的一区二区| 50度灰在线观看| 亚洲资源网站| 亚洲mm色国产网站| 综合久久2023| 久久精品视频亚洲| 日韩一级片免费| 在线精品视频免费播放| 99精品久久久久| 久久精品亚洲精品国产欧美| 青青草原播放器| 久久精品日韩欧美| 国产精品国三级国产av| 国产亚洲电影| 国产98在线|日韩| 欧美与亚洲与日本直播| 欧美国产日本在线| av影片在线看| 亚洲精品黄网在线观看| 97国产精品久久久| 狠狠躁夜夜躁久久躁别揉| 登山的目的在线| 久久综合久久综合久久综合| www.偷拍.com| 日韩黄色小视频| 国产男女在线观看| 欧美精品一线| 在线视频不卡一区二区| 亚洲尤物av| 精品国产一区二区三区久久久久久| 欧美a一级片| 国产成人午夜视频网址| 55av亚洲| 欧美国产日韩一区二区在线观看 | 亚洲午夜免费电影| 中文字幕观看av| 欧美激情一区二区三区在线| 国产毛片毛片毛片毛片毛片毛片| 国产精品自拍网站| 中文字幕第100页| 日韩国产成人精品| 男人揉女人奶房视频60分| 精品白丝av| 日本久久久网站| 色乱码一区二区三区网站| 茄子视频成人在线观看 | 国产精品正在播放| 午夜久久久精品| 视频在线观看一区| 一女被多男玩喷潮视频| 亚洲日本视频| 成人性免费视频| 一本色道久久综合一区| 久艹视频在线免费观看| 亚洲国产美女| 黄网站欧美内射| 日韩视频一区| 少妇高潮喷水在线观看| 99精品久久久| 5月婷婷6月丁香| 亚洲专区一区二区三区| 人妻有码中文字幕| 久久亚洲图片| 午夜视频在线瓜伦| 天堂成人国产精品一区| 亚洲中文字幕久久精品无码喷水| 午夜一区不卡| 欧美日韩在线免费播放| 奇米精品一区二区三区四区 | 日韩a级黄色片| 国产精品a级| 一卡二卡三卡视频| 亚洲人人精品| 成人在线看视频| 日本美女一区二区三区视频| 免费看国产黄色片| 久久91精品国产91久久小草| 中文字幕精品一区二区三区在线| 国产一区二区精品在线观看| 国产成人av片| 91美女精品福利| 亚洲av成人无码久久精品 | 亚洲精品国产精品国自产在线 | 国产女无套免费视频| 欧美一区欧美二区| 成人h动漫精品一区二区无码 | 日本三级韩国三级欧美三级| 欧美极品少妇xxxxx| 天堂资源在线| 国产欧美日韩免费| 粉嫩一区二区三区在线观看| 国产女主播一区二区三区| 美女精品一区最新中文字幕一区二区三区| 日本一区二区久久精品| 888久久久| av在线观看地址| 奇米影视7777精品一区二区| 久久久久中文字幕亚洲精品| 久久久久久一二三区| 亚洲色图27p| 亚洲福利视频一区二区| 香蕉污视频在线观看| 91精品国产色综合久久不卡电影| 免费成人在线看| 在线精品国产欧美| 国精一区二区三区| 国产精品91一区| 永久免费精品视频| 日日噜噜噜噜夜夜爽亚洲精品| 综合视频在线| 免费国产成人av| 成人性生交大片免费看中文| 公肉吊粗大爽色翁浪妇视频| 亚洲午夜视频在线观看| 亚洲天堂视频在线播放| 精品va天堂亚洲国产| 91精品国产综合久久久久久豆腐| 久久久久久国产| 国产精品第一| 国产日韩久久| 91av精品| 久久久久久久久久久久91| 99在线精品观看| 波多野结衣亚洲一区二区| 色婷婷综合久久久中文一区二区| 国产女人18毛片水18精| 一区二区三区国产在线观看| ririsao久久精品一区| 成人福利在线观看| 精品一区二区三区的国产在线观看| 97超碰在线人人| 国产又黄又大久久| 国产一二三四五区| 婷婷综合另类小说色区| 国产同性人妖ts口直男| 最近2019好看的中文字幕免费| 免费在线小视频| 豆国产97在线| 91成人免费| 加勒比av中文字幕| 国产精品免费人成网站| 在线观看国产区| 伊人久久久久久久久久久| 国产伦理精品| 精品人伦一区二区三区| 欧美三级不卡| 两女双腿交缠激烈磨豆腐| 18涩涩午夜精品.www| 中文字幕久久网| 中文精品99久久国产香蕉| 蜜桃成人精品| 色大师av一区二区三区| 视频一区二区三区在线| 国产成人精品无码免费看夜聊软件| 图片区小说区国产精品视频| 男人天堂综合网| 久久久人成影片一区二区三区观看 | 欧美日韩国产色视频| 老牛影视av牛牛影视av| 久久全球大尺度高清视频| 99国产精品免费网站| av在线播放天堂| 99久久久精品免费观看国产蜜| 精品无码一区二区三区电影桃花| 日韩欧美三级在线| 先锋影音在线资源站91| 97人人模人人爽人人少妇| 亚洲福利一区| 制服丝袜第二页| 一本久道中文字幕精品亚洲嫩| 国产福利电影在线| 国产精品久久婷婷六月丁香| 久久人人99| 波多野结衣免费观看| 亚洲一级片在线观看| 天天av天天翘| 日本精品视频网站| 俺要去色综合狠狠| 欧美一级xxxx| 一区二区三区日韩精品视频| 黄色www视频| 日本欧美黄网站| 欧美电影三区| 久久久久亚洲av无码网站| 精品动漫一区二区| 国产女人在线观看| 成人国产精品一区| 亚洲二区免费| 91精品国自产在线| 日韩一区和二区| 国产乱码精品一区二三赶尸艳谈| 青青草国产精品| 国产精品影音先锋| 影音先锋在线国产| 久久激情五月丁香伊人| 风间由美性色一区二区三区四区| 熟妇人妻va精品中文字幕 | 伊人久久久久久久久久| 精品国产亚洲一区二区三区在线 | 综合欧美亚洲| 北条麻妃在线视频| 一区二区三区四区乱视频| 九九九伊在人线综合| 亚洲综合社区网| 久久久亚洲人| 欧美精品一区二区成人| 亚洲色图第三页| 88久久精品| 鲁一鲁一鲁一鲁一av| 亚洲成av人片在线观看| jizz在线观看中文| 国产精品免费一区二区三区在线观看 | a在线观看视频| 国产成人精品优优av| 国内精品久久久久久久影视麻豆| 成人黄色免费网址|