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

SpringBoot 自動裝配的原理分析

開發 前端
關于 SpringBoot? 的自動裝配功能,相信是每一個 Java 程序員天天都會用到的一個功能,但是它究竟是如何實現的呢?今天阿粉來帶大家看一下。

自動裝配案例

首先我們通過一個案例來看一下自動裝配的效果,創建一個 SpringBoot? 的項目,在 pom 文件中加入下面的依賴。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

其中 web? 的依賴表示我們這是一個 web? 項目,redis? 的依賴就是我們這邊是要驗證的功能依賴。隨后在 application.properties? 配置文件中增加 redis 的相關配置如下

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456

再編寫一個 Controller? 和 Service 類,相關代碼如下。

package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@Autowired
private HelloService helloService;

@GetMapping(value = "/hello")
public String hello(@RequestParam("name") String name) {
return helloService.sayHello(name);
}

}

service 代碼如下

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class HelloService {

@Autowired
RedisTemplate<String, String> redisTemplate;

public String sayHello(String name) {
String result = doSomething(name);
redisTemplate.opsForValue().set("name", result);
result = redisTemplate.opsForValue().get("name");
return "hello: " + result;
}

private String doSomething(String name) {
return name + " 歡迎關注 Java 極客技術";
}

}

啟動項目,然后我們通過訪問 http://127.0.0.1:8080/hello?name=ziyou,可以看到正常訪問。接下來我們再通過 Redis? 的客戶端,去觀察一下數據是否正確的寫入到 Redis 中,效果跟我們想象的一致。

圖片

自動裝配分析

看到這里很多小伙伴就會說,這個寫法我天天都在使用,用起來是真的爽。雖然用起來是很爽,但是大家有沒有想過一個問題,那就是在我們的 HelloService? 中通過 @Autowired? 注入了一個 RedisTemplate? 類,但是我們的代碼中并沒有寫過這個類,也沒有使用類似于@RestControlle?r,@Service? 這樣的注解將 RedisTemplate? 注入到 Spring IoC? 容器中,那為什么我們就可以通過 @Autowired?  注解從 IoC? 容器中獲取到 RedisTemplate  這個類呢?這里就是常說的自動裝配的功能了。

首先我們看下項目的啟動類;

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(value = "com.example.demo.*")
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

在啟動類上面有一個 @SpringBootApplication 注解,我們點進去可以看到如下內容:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// 省略
}

在這個注解中,其中有一個 @EnableAutoConfiguration 注解,正是因為有了這樣一個注解,我們才得以實現自動裝配的功能。繼續往下面看。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

Class<?>[] exclude() default {};

String[] excludeName() default {};
}

可以看到 @EnableAutoConfiguration? 注解中有一個 @Import({AutoConfigurationImportSelector.class})?,導入了一個  AutoConfigurationImportSelector? 類,該類間接實現了 ImportSelector? 接口,實現了一個 String[] selectImports(AnnotationMetadata importingClassMetadata);? 方法,這個方法的返回值是一個字符串數組,對應的是一系列主要注入到 Spring IoC? 容器中的類名。當在 @Import? 中導入一個 ImportSelector? 的實現類之后,會把該實現類中返回的 Class? 名稱都裝載到 IoC 容器中。

一旦被裝載到 IoC? 容器中過后,我們在后續就可以通過 @Autowired?  來進行使用了。接下來我們看下 selectImports? 方法里面的實現,當中引用了 getCandidateConfigurations? 方法 ,其中的  ImportCandidates.load? 方法我們可以看到是通過加載 String location = String.format("META-INF/spring/%s.imports", annotation.getName());? 對應路徑下的 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,其中就包含了很多自動裝配的配置類。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}

圖片

我們可以看到這個文件中有一個 RedisAutoConfiguration? 配置類,在這個配置中就有我們需要的 RedisTemplate? 類的 Bean?,同時也可以看到,在類上面有一個 @ConditionalOnClass({RedisOperations.class})? 注解,表示只要在類路徑上有 RedisOperations.class 這個類的時候才會進行實例化。這也就是為什么只要我們添加了依賴,就可以自動裝配的原因。

圖片

通過 org.springframework.boot.autoconfigure.AutoConfiguration.imports? 這個文件,我們可以看到有很多官方幫我們實現好了配置類,這些功能只要我們在 pom? 文件中添加對應的 starter 依賴,然后做一些簡單的配置就可以直接使用。

其中本質上自動裝配的原理很簡單,本質上都需要實現一個配置類,只不過這個配置類是官方幫我們創建好了,再加了一些條件類注解,讓對應的實例化只發生類類路徑存在某些類的時候才會觸發。這個配置類跟我們平常自己通過 JavaConfig 形式編寫的配置類沒有本質的區別。

自動裝配總結

從上面的分析我們就可以看的出來,之所以很多時候我們使用 SpringBoot 是如此的簡單,全都是依賴約定優于配置的思想,很多復雜的邏輯,在框架底層都幫我們做了默認的實現。雖然用起來很爽,但是很多時候會讓程序員不懂原理,我們需要做的不僅是會使用,而更要知道底層的邏輯,才能走的更遠。

基于上面的分析,我們還可以知道,如果我們要實現一個自己的 starter? 其實也很簡單,只要安裝上面的約定,編寫我們自己的配置類和配置文件即可。后面的文章阿粉會帶你手寫一個自己的 starter 來具體實現一下。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2024-05-29 07:47:30

SpringJava@Resource

2023-11-01 09:07:01

Spring裝配源碼

2024-12-25 16:01:01

2023-09-28 09:17:18

SpringBootBean

2025-06-12 05:00:00

@Autowired自動裝配實現機制

2021-06-17 08:05:59

SpringBoot條件裝配

2024-04-26 08:46:42

Spring自動裝配核心內容

2025-05-22 09:54:06

2012-02-17 10:50:10

Java

2011-04-20 09:27:32

Spring

2025-02-05 12:28:44

2012-11-28 10:37:25

Linux集群安裝配置

2022-02-16 09:01:13

iOSS開發XCode

2023-06-30 07:51:44

springboot初始化邏輯

2010-04-29 10:11:07

Linux集群

2021-08-06 08:33:27

Springboot分布式Seata

2016-09-12 14:33:20

javaHashMap

2010-06-29 17:07:10

Linux SNMP代

2014-08-13 18:47:46

2024-11-04 16:29:19

點贊
收藏

51CTO技術棧公眾號

亚洲av无码一区二区三区dv| 人人人妻人人澡人人爽欧美一区| 免费日本一区二区三区视频| 国产一区二区三区在线观看精品| 精品中文字幕乱| 污片免费在线观看| 日韩精品一区二区三区av| 国产精品视频在线看| 97在线中文字幕| 日韩在线播放中文字幕| 亚洲成人精品| 亚洲精品小视频| 97超碰人人爽| 九色porny自拍视频在线播放| 国产人妖乱国产精品人妖| 91综合免费在线| 91精品国产高清一区二区三密臀| 99re6这里只有精品| 亚洲精品一区二区三区99| chinese少妇国语对白| 米奇精品一区二区三区| 99久久精品费精品国产一区二区| 国产精品一区二区三区久久| 欧美一级高潮片| 欧美日韩在线网站| 精品国产电影一区二区| 久久精品免费网站| 美女网站视频在线| 国产精品成人网| 久久影院理伦片| 国产精品嫩草影院精东| 99国产精品久久久久久久| 色偷偷噜噜噜亚洲男人| 免费在线观看成年人视频| 亚洲一区有码| 在线欧美日韩精品| 国产精品一线二线三线| 日本在线视频观看| 久久精品一区八戒影视| 国产精品对白一区二区三区| 国产精品女人久久久| 日韩精品国产精品| 啪一啪鲁一鲁2019在线视频| 久久精品一级片| 久久久精品久久久久久96| 国产亚洲激情视频在线| 波多野结衣有码| 2020国产精品极品色在线观看| 精品视频一区二区不卡| 久久精品香蕉视频| 伊人成综合网站| 亚洲女爱视频在线| 欧美精品一区二区三区在线看午夜| 精品国产999久久久免费| 麻豆国产精品一区二区三区| 国产精品国产三级国产aⅴ9色| 手机看片久久久| 中文在线一区| 68精品久久久久久欧美| 日韩av在线电影| 精品91在线| 欧美激情国内偷拍| 久草免费在线视频观看| 国产一区美女| 久久久久久久网站| 日本一本高清视频| 亚洲一区免费| 热久久免费视频精品| 日日骚av一区二区| 日本不卡视频在线观看| 国产精品一区二区性色av| 人妻中文字幕一区二区三区| 奇米777欧美一区二区| 国产精品久久久久久婷婷天堂 | 亚洲国产合集| 精品一区二区三区四区在线| 亚洲性猛交xxxx乱大交| 欧美综合在线视频观看| 久久久国产精品亚洲一区| 成年人av电影| 亚洲精品综合| 欧美最猛性xxxxx免费| 国产精品无码一区| 激情综合网av| 国产伦精品一区二区三区高清| 天天摸夜夜添狠狠添婷婷| 91一区二区三区在线播放| 欧美日韩精品免费看| 国模吧精品人体gogo| 亚洲国产经典视频| 黄色一级片av| 樱花草涩涩www在线播放| 欧美亚一区二区| 国产又粗又长又爽又黄的视频| 成人盗摄视频| 伊人青青综合网站| 欧美精品久久久久性色| 久久久久久9| 91手机视频在线观看| 午夜在线观看视频18| 国产欧美日韩视频在线观看| 国产精品久久久影院| 在线免费av资源| 6080yy午夜一二三区久久| 无码国产精品一区二区免费式直播| 美日韩中文字幕| 久久天堂电影网| 天天综合天天干| 日本亚洲三级在线| 国产视频在线观看一区| 91精品专区| 欧美日韩黄色大片| 手机在线免费毛片| 国产一区二区三区网| 久久久噜噜噜久久久| 亚洲欧美日韩一区二区三区四区| 国产不卡视频在线播放| 奇米精品在线| segui88久久综合| 3d成人h动漫网站入口| 免费在线观看你懂的| 欧美日韩国产一区精品一区| 国产精品视频在线播放| 天堂资源中文在线| 亚洲一区成人在线| 两性午夜免费视频| 日韩成人精品一区| 青草青草久热精品视频在线观看| 超碰人人人人人人| 中文字幕视频一区二区三区久| 国产一区二区三区精彩视频 | 久久99九九| 秋霞在线午夜| 欧美情侣在线播放| xxx在线播放| 国产精品综合| 韩国成人av| h片在线观看| 日韩视频在线永久播放| 色老板免费视频| 美女任你摸久久| 视频在线观看成人| 精品日韩视频| 国产亚洲美女精品久久久| 国产专区第一页| 久久婷婷色综合| aa免费在线观看| 日韩av字幕| 欧美在线观看网站| 日色在线视频| 色综合久久天天综合网| 国产偷人妻精品一区| 日韩一区二区久久| 麻豆蜜桃91| 大胆人体一区| 亚洲日韩欧美视频一区| 成人公开免费视频| 久久精品亚洲麻豆av一区二区| 男人天堂999| 免费av一区| 国产精品美女久久久免费| 成人在线免费公开观看视频| 在线观看视频91| 激情五月激情综合| 国产一区二区成人久久免费影院| 无码毛片aaa在线| 亚洲日本va午夜在线电影| 欧美富婆性猛交| 午夜成人鲁丝片午夜精品| 色综合天天综合狠狠| www.日本高清视频| 国产麻豆午夜三级精品| 国产小视频免费| 欧美日韩大片免费观看| 国产精品成人av性教育| 麻豆视频在线免费观看| 日韩免费一区二区| 国产污污视频在线观看| 久久久欧美精品sm网站| 色呦色呦色精品| 红桃视频欧美| 欧洲精品久久| 99精品美女视频在线观看热舞| 欧美激情视频在线观看| 日本一区视频| 777xxx欧美| 日韩三级一区二区三区| 国产亚洲福利社区一区| 国产欧美精品一二三| 精品动漫3d一区二区三区免费版| 欧洲国产精品| 秋霞影院一区| 国产成人极品视频| 中文字幕有码在线观看| 亚洲欧美国产精品| 国产精品欧美久久久久天天影视| 亚洲一区二区三区中文字幕在线| 超碰97人人干| 国内精品国产成人| www.四虎成人| 国产精品a久久久久| 麻豆亚洲一区| 99re6热只有精品免费观看| 国产成人综合一区二区三区| 中文字幕免费高清电视剧网站在线观看 | 2024国产精品视频| 亚洲精品国产一区二区三区| 99伊人成综合| 91香蕉视频网址| 久久99国产成人小视频| 91精品久久香蕉国产线看观看| 国产免费不卡| 久久久久久综合网天天| 欧美成人精品一区二区男人看| 日韩av中文字幕在线播放| 国产精品久久久久久69| 一道本成人在线| 四虎成人精品永久免费av| 国产精品美女久久久久aⅴ国产馆| 午夜男人的天堂| 国产麻豆一精品一av一免费| 在线黄色免费观看| 国产日韩高清一区二区三区在线| 男女啪啪免费观看| 四虎8848精品成人免费网站| 欧洲精品一区色| 天堂成人娱乐在线视频免费播放网站 | 裸体裸乳免费看| 色爱综合网欧美| 欧美日韩亚洲在线| 欧美一级一片| 国产精品欧美久久| 成人在线视频你懂的| 91牛牛免费视频| 伊人久久大香线蕉综合影院首页| 国产精品99久久久久久久久| 粉嫩一区二区| 2019av中文字幕| 国产精选在线| 国内精品久久久| av在线网页| 久久全球大尺度高清视频| 成人video亚洲精品| 日韩中文综合网| 北条麻妃在线| 色偷偷888欧美精品久久久 | 久久av.com| 日本福利在线| zzijzzij亚洲日本成熟少妇| 日韩精品毛片| 久久久电影免费观看完整版| 免费在线观看黄| 久久亚洲国产精品成人av秋霞| 黄色av免费在线| 欧美尺度大的性做爰视频| 69成人在线| 欧美激情一区二区三区高清视频 | 九九热精品视频在线观看| 久久久久久久久久久久久久久久av| 奇米777国产一区国产二区| 久久精品magnetxturnbtih| 神马午夜久久| 日韩尤物视频| 国产精品传媒精东影业在线| 影音先锋男人的网站| 亚洲91久久| 免费高清一区二区三区| 最新亚洲激情| 午夜视频在线瓜伦| 麻豆国产91在线播放| 日本中文字幕在线不卡| 成人在线视频一区二区| 日韩片在线观看| 国产目拍亚洲精品99久久精品| 欧美美女性生活视频| 亚洲综合色丁香婷婷六月图片| 国产网站在线看| 欧美色视频日本高清在线观看| 日批视频免费观看| 91精品国产全国免费观看| 欧洲成人一区二区三区| 亚洲片在线观看| 成人在线免费看黄| 91精品国产乱码久久久久久蜜臀| 天天免费亚洲黑人免费| 91色视频在线观看| 日韩动漫一区| 一本久道久久综合| 激情国产一区| 手机看片福利日韩| 豆国产96在线|亚洲| 国产激情在线免费观看| 亚洲免费视频中文字幕| 欧美一区二区三区四| 7777女厕盗摄久久久| 头脑特工队2免费完整版在线观看| 日韩在线观看视频免费| av电影在线地址| 国产精品久久久久久久午夜| 国产精品极品在线观看| 视频在线精品一区| 欧美日韩1区| 欧美一级特黄a| 成人av免费网站| 麻豆一区在线观看| 精品久久久一区二区| 国产精品爽爽久久| 亚洲美女在线看| 91国内在线| 国产精品综合不卡av| 欧美黄色录像| 中文字幕乱码免费| 日本aⅴ精品一区二区三区| 制服丝袜在线第一页| 一区二区中文视频| 国产女主播喷水视频在线观看| 亚洲成人三级在线| 美女免费久久| 国产精品极品在线| 亚洲精品动态| 国产人妻777人伦精品hd| 精品一区二区影视| 超薄肉色丝袜一二三| 狠狠色狠色综合曰曰| 亚洲精品中文字幕成人片 | 亚洲精品自拍视频在线观看| 欧美特级www| 日韩中文字幕影院| 欧美日韩国产成人高清视频| 亚洲一区二区av| 一区二区三区我不卡| 日韩av中文在线观看| 欧美做受喷浆在线观看| 亚洲午夜免费电影| www.黄色小说.com| 另类专区欧美制服同性| 一区在线不卡| 不卡中文字幕在线| 韩国精品一区二区| 永久免费看片直接| 欧美精品电影在线播放| 在线观看精品一区二区三区| 国产精品免费福利| 日本欧美国产| 国产成人黄色网址| 国产欧美精品一区二区三区四区| 国产亚洲欧美日韩高清| 亚洲色图欧美制服丝袜另类第一页| 草草在线视频| 久久天堂国产精品| 性欧美精品高清| 日本xxxxxxxxx18| 欧美中文一区二区三区| 中文字幕日本在线观看| 国产欧美久久一区二区| 国产精品99一区二区三| 亚洲三级在线观看视频| 亚洲欧洲综合另类在线| 精品黑人一区二区三区国语馆| 久久91亚洲精品中文字幕| 91综合久久爱com| 浮妇高潮喷白浆视频| ww亚洲ww在线观看国产| 亚洲精品国产无码| 日韩在线观看网址| 亚洲经典视频| 国自产拍偷拍精品啪啪一区二区| 91蜜桃在线观看| 欧美另类高清videos的特点| 久久亚洲精品一区二区| 国产成人澳门| 日日摸日日碰夜夜爽av| 国产精品免费网站在线观看| 91丨九色丨丰满| 欧美激情国产精品| 岳的好大精品一区二区三区| 香港日本韩国三级网站| 亚洲欧美日韩在线播放| 亚洲免费国产视频| 国产91色在线| 国产精品久久久久久久| 稀缺呦国内精品呦| 91久久一区二区| 成人看av片| 狠狠色综合色区| 免费观看30秒视频久久| 九九热这里有精品视频| 亚洲欧美国产日韩中文字幕| 四虎视频在线精品免费网址| 久久在线中文字幕| 国产欧美日本一区视频| 国产丰满美女做爰| 国产mv久久久| 欧美精品1区| 色一情一交一乱一区二区三区| 91精品国产麻豆| 成人黄色免费短视频| 9191国产视频| 日本一区二区三区视频视频| 国产91久久久|