0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入了解SpringBoot的自動(dòng)配置原理

jf_78858299 ? 來源:itdage ? 作者:野馬哥 ? 2023-04-07 11:22 ? 次閱讀

通過這篇文章我們來深入了解SpringBoot的自動(dòng)配置原理,并分析SpringBoot是如何神不知,鬼不覺的幫我們做了那么多的事情,讓我們只需要關(guān)心業(yè)務(wù)邏輯開發(fā)就可以了。

創(chuàng)建一個(gè)SpringBoot項(xiàng)目

圖片

首先還是得從主程序MainApplication開始

圖片

里面有一個(gè)main方法,用來啟動(dòng)SpringBoot應(yīng)用,但是最重要的還是@SpringBootApplication這個(gè)核心注解

圖片

@SpringBootApplication注解是一個(gè)復(fù)合注解,他的作用就相當(dāng)于下面的三個(gè)注解

圖片

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

接下來我們挨個(gè)分析這些注解的功能

第一個(gè)注解是@SpringBootConfiguration

圖片

這個(gè)注解我們點(diǎn)進(jìn)去會(huì)發(fā)現(xiàn)

圖片

他就是一個(gè)@Configuration,那這個(gè)注解的作用很簡(jiǎn)單,他就代表當(dāng)前類是一個(gè)配置類,而@SpringBootConfiguration只不過是一個(gè)核心的配置類,僅此而已。

第二個(gè)注解@ComponentScan

圖片

這個(gè)注解也很簡(jiǎn)單,他其實(shí)就是一個(gè)包掃描,給我們指定要掃描哪些東西,他其中有兩個(gè)自定義掃描器,就是上面的兩個(gè)classes,這個(gè)和Spring中的注解是一樣的,在這里研究這兩個(gè)的意義也不是很大。

我們來看第三個(gè)注解@EnableAutoConfiguration,也是最重要的一個(gè)

圖片

這個(gè)注解,點(diǎn)進(jìn)去會(huì)發(fā)現(xiàn),他也是一個(gè)復(fù)合注解

圖片

第一個(gè)注解@AutoConfigurationPackage,翻譯過來就是自動(dòng)配置包,指定了默認(rèn)的包規(guī)則,我們?cè)冱c(diǎn)進(jìn)去,來看

圖片

這個(gè)@Import注解的作用是給容器中導(dǎo)入一個(gè)組件。

也就是說在這里其實(shí)是利用Registrar給容器中導(dǎo)入了一系列組件,并且指定了將MainApplication所在包下的所有組件導(dǎo)入進(jìn)來。這個(gè)其實(shí)也不是我們要研究的重點(diǎn)

再來看@EnableAutoConfiguration中的第二個(gè)注解

@Import({AutoConfigurationImportSelector.class})

我們點(diǎn)進(jìn)去,AutoConfigurationImportSelector中有一個(gè)方法叫做

selectImports方法

圖片

這個(gè)方法的作用就是我們到底要給容器導(dǎo)入哪些組件,方法的返回值是一個(gè)String[ ]數(shù)組。

得到所有組件是通過 getAutoConfigurationEntry方法,調(diào)用這個(gè)方法以后會(huì)得到

圖片

autoConfigurationEntry的對(duì)象

圖片

通過autoConfigurationEntry得到所有的配置,然后轉(zhuǎn)成String數(shù)組返回出去。

圖片

autoConfigurationEntry.getConfigurations( )

所以,在這一塊兒我們只要研究清楚getAutoConfigurationEntry(annotationMetadata)這個(gè)方法就可以了。

getAutoConfigurationEntry(annotationMetadata)這個(gè)方法的作用是給容器批量導(dǎo)入一些組件,通過斷點(diǎn)調(diào)試的方式,來研究這個(gè)方法具體導(dǎo)入了哪些組件

在這個(gè)方法的實(shí)現(xiàn)上打一個(gè)斷點(diǎn),以debug模式運(yùn)行,進(jìn)來以后F8 step over往下放行,其中有一個(gè)方法叫做getCandidateConfigurations(annotationMetadata,attributes);

圖片

這個(gè)方法的作用是獲取所有候選的配置

調(diào)用這個(gè)方法會(huì)得到一個(gè)configurations對(duì)象,再往下放行,我們會(huì)看到這個(gè)configurations對(duì)象會(huì)進(jìn)行刪除重復(fù)的操作,得到排除的操作和過濾的一些操作,最后進(jìn)行一個(gè)封裝,給他返回出去

圖片這個(gè)configurations中有124個(gè)組件,他們是默認(rèn)要導(dǎo)入到容器中的。

圖片

為了弄清楚這124個(gè)組件是以什么樣的規(guī)則導(dǎo)入這124個(gè)組件,接下來重新以debug方式運(yùn)行,getCandidateConfigurations(annotationMetadata,attributes)方法,F(xiàn)7 step into 進(jìn)來

圖片

可以看到,他其實(shí)是通過SpringFactoryLoader使用Spring的這些工廠加載器,來加載工廠名稱,選擇LoadFactoryNames,點(diǎn)進(jìn)去,可以看到返回的是loadSpringFactories

圖片

看這個(gè)方法的實(shí)現(xiàn),其實(shí)最終就是通過這個(gè)方法來進(jìn)行加載,最終得到一個(gè)Map集合

圖片

所以我們只要搞明白loadSpringFactories這個(gè)方法就可以了,我們?cè)谶@兒打一個(gè)斷點(diǎn),然后重新啟動(dòng)

圖片

F8 放行,可以看到第一個(gè)result 是初始的為null ,

圖片

往下放行,可以看到classLoader.getResources()的方法

他相當(dāng)于是從META-INF/spring.factories位置來獲取資源文件,并且這個(gè)位置他默認(rèn)會(huì)掃描當(dāng)前系統(tǒng)里面所有META-INF/spring.factories位置的文件

圖片

我們看spring-boot-autoconfigure-2.2.0.RELEASE.jar

圖片

那這個(gè)里面呢,最核心的東西就出現(xiàn)了

往下可以看到,從22行到145行,就是要加載的之前我們說的124個(gè)組件,他其實(shí)是在文件當(dāng)中寫死的,我們發(fā)現(xiàn)@EnableAutoConfiguration要加載哪些類,在這兒都有配置,并且每一個(gè)都有一個(gè)換行符,都是一個(gè)全類名,都是叫XXXXAutoConfiguration,就是什么東西的自動(dòng)配置。

那SpringBoot兼容的全場(chǎng)景自動(dòng)配置,他全在這兒列舉過來了。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\\
org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoConfiguration,\\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\\
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

我們把這124個(gè)組件全部拿過來,但是這個(gè)時(shí)候問題又來了,要把這124個(gè)組件全部加載進(jìn)來,但我們的SpringBoot容器里面可能都沒有這么多的組件,所以,在這個(gè)時(shí)候就涉及到了SpringBoot中的按需開啟自動(dòng)配置項(xiàng)。

打開下面的

圖片

比如消息隊(duì)列,AOP切面這些包,那么這些功能,能不能實(shí)現(xiàn)呢?

帶著這個(gè)疑問,點(diǎn)開消息隊(duì)列的類,來看

圖片

還有AOP切面的類

圖片

可以發(fā)現(xiàn),這些功能并沒有實(shí)現(xiàn),那沒有實(shí)現(xiàn)的原因其實(shí)也很簡(jiǎn)單

圖片

@ ConditionalOnClass這個(gè)注解的作用就是按條件,說白了就是我們整個(gè)的類路徑存在這個(gè)類下面的一堆配置才生效,那么什么時(shí)候才會(huì)有這個(gè)類呢?其實(shí)就是你只有導(dǎo)入了aop相關(guān)的包,比如我們這邊需要導(dǎo)入的(org.aspectj.weaver.Advice)

圖片

導(dǎo)入這個(gè)包以后才會(huì)有上面的那些類,有了這些類以后這些組件才會(huì)生效。

總結(jié) :剛開始我們看到他一股腦加載了所有的組件,但是呢,最終得益于SpringBoot的按需加載的注解,就是上面我們說的條件裝配@ConditionalOnClass,所以好多東西,并不能完全開啟。這個(gè)就是SpringBoot自動(dòng)配置的核心,啟動(dòng)時(shí)加載所有,最終按照條件進(jìn)行裝配。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104097
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14259
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    148

    瀏覽量

    35675
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    172

    瀏覽量

    145
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入了解示波器

    深入了解示波器
    發(fā)表于 11-14 22:32

    專家開講:深入了解電池技術(shù) ──Part 1

    。筆者不會(huì)一一詳細(xì)介紹所有的電池技術(shù),只選擇一些常見或是值得認(rèn)識(shí)的;而在接下來的專欄里,筆者將開始介紹電池分類、常見規(guī)格以及專業(yè)術(shù)語(yǔ),如果你有特別想知道的電池技術(shù),歡迎留言!擴(kuò)展閱讀:專家開講:深入了解
    發(fā)表于 08-18 09:33

    專家開講:深入了解電池技術(shù)──Part 3

    資深工程師 Ivan Cowie 的「深入了解電池技術(shù)」專欄Part 3來啰!這次要介紹的是鉛酸電池(lead-acidbatteries)技術(shù)。鉛酸電池是在1859年由法國(guó)物理學(xué)家Gaston
    發(fā)表于 08-18 09:37

    單片機(jī)的深入了解!

    項(xiàng)目名稱:?jiǎn)纹瑱C(jī)的深入了解!項(xiàng)目是否開源:否申請(qǐng)開發(fā)板數(shù)量:1 塊申請(qǐng)人團(tuán)隊(duì)介紹:我們團(tuán)隊(duì)由五個(gè)人組成,我們打算開始著手單片機(jī)的程序改編,設(shè)計(jì)一些比較特殊新穎的東西!希望給以支持!
    發(fā)表于 10-12 20:00

    深入了解LabVIEW FPGA資料分享

    深入了解LabVIEW FPGA
    發(fā)表于 05-27 08:35

    深入了解單片機(jī)匯編重要嗎?

    不學(xué)匯編,只用C語(yǔ)言,能不能深入了解單片機(jī)?
    發(fā)表于 07-21 10:38

    深入了解主動(dòng)電掃描陣列(AESA)雷達(dá)系統(tǒng)

    深入了解主動(dòng)電掃描陣列(AESA)雷達(dá)系統(tǒng)
    發(fā)表于 05-24 06:51

    采用抓取波形的方式對(duì)SPI進(jìn)行一下深入了解

    SPI分析平時(shí)會(huì)使用硬件SPI,但是只用于應(yīng)用沒有具體深入了解SPI的執(zhí)行流程,此處我采用抓取波形的方式對(duì)SPI進(jìn)行了一下深入了解。STM32配置void SPI1_Init(void
    發(fā)表于 02-17 06:01

    示波器的深入了解

    示波器的深入了解 引言自然界運(yùn)行著各種形式的正弦波,比如海浪、地震、聲波、爆破、空氣中傳播的聲音,或者身體運(yùn)轉(zhuǎn)的自然節(jié)律。物理世界里,能
    發(fā)表于 11-04 11:53 ?52次下載
    示波器的<b class='flag-5'>深入了解</b>

    深入了解示波器入門手冊(cè)

    深入了解示波器入門手冊(cè)
    發(fā)表于 03-27 17:43 ?241次下載
    <b class='flag-5'>深入了解</b>示波器入門手冊(cè)

    深入了解電路噪聲的那些事

    模擬電子的相關(guān)知識(shí)學(xué)習(xí)教材資料——深入了解電路噪聲的那些事
    發(fā)表于 09-27 15:19 ?0次下載

    深入了解電感與磁珠的異同

    模擬電子的相關(guān)知識(shí)學(xué)習(xí)教材資料——深入了解電感與磁珠的異同
    發(fā)表于 09-27 15:19 ?0次下載

    帶你深入了解示波器

    帶你深入了解示波器
    發(fā)表于 02-07 14:26 ?18次下載

    深入了解安全光柵

    深入了解安全光柵
    的頭像 發(fā)表于 06-25 13:53 ?1027次閱讀
    <b class='flag-5'>深入了解</b>安全光柵

    深入了解 GaN 技術(shù)

    深入了解 GaN 技術(shù)
    的頭像 發(fā)表于 12-06 17:28 ?5901次閱讀
    <b class='flag-5'>深入了解</b> GaN 技術(shù)