h5響應(yīng)式企業(yè)網(wǎng)站源碼百度推廣客戶端下載
自動(dòng)裝配
spring?boot的自動(dòng)裝配(auto?configuration)是通過spring?framework的依賴注入(dependency?injection, DI)和配置類的組合來實(shí)現(xiàn)的。?spring?boot?的自動(dòng)裝配機(jī)制可以簡(jiǎn)化應(yīng)用的配置過程,是開發(fā)者不再需要手動(dòng)創(chuàng)建配置文件或管理bean.?而是通過注解和配置類自動(dòng)完成。
- springboot?自動(dòng)裝配的原理
- 依賴注入的核心注解
- 自動(dòng)配置類的加載機(jī)制
- @SpringBootApplication注解詳解
- 自定義配置和自動(dòng)配置的關(guān)系
- 常見的自動(dòng)裝配場(chǎng)景
- 總結(jié)
springboot自動(dòng)裝配的原理:?
springboot的自動(dòng)裝配是基于以下幾個(gè)核心機(jī)制實(shí)現(xiàn)的:
@SpringBootApplication:?它是一個(gè)組合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan.
- @SpringBootConfiguration:?主要是聲明該類是一個(gè)配置類,這是Springboot專用的配置聲明類
- @EnableAutoConfiguration:?啟動(dòng)springboot?自動(dòng)配置機(jī)制的核心注解,它會(huì)根據(jù)類路徑下的依賴來自動(dòng)裝配Spring應(yīng)用程序。
- @ComponentScan:?掃碼@Component? @Service @Repository? @Controller等標(biāo)注的類,使得這些bean自動(dòng)注冊(cè)到spring容器中。如果沒有配置路徑或者類。直接掃描該類所在包及其子包中的組件。
- spring.factories: SpringBoot?使用spring-boot-autoconfigure中的META-INFO/spring.factories文件來管理自動(dòng)裝配的的類。spring.factories文件中列出的所有的自動(dòng)配置類,這些類在啟動(dòng)時(shí)都會(huì)被加載并注冊(cè)
?依賴注入的核心注解:
SpringBoot?依賴于springFramework?的依賴注入機(jī)制,通過注解實(shí)現(xiàn)Bean的自動(dòng)裝配。主要注解有:
- @Autowired:?可以注入構(gòu)造方法、字段、Setter方法。 Spring會(huì)根據(jù)類型在容器中查找匹配的Bean并注入
- @Component、@Service、@Repository、@Controller標(biāo)識(shí)類為spring管理的Bean.?其中@Component是通用的注解,?而@Service、@Repository、@Controller是它的變種,分別用于業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層、控制層
- @Configuration:?表示一個(gè)配置類,可以定義@Bean方法,將返回的bean注冊(cè)到Spring容器中。
@Configuration public class MyConfiguration{@Beanpublic MyService myService(){return new MyService();} }
自動(dòng)配置類的加載機(jī)制
-
Spring Boot通過@EnableAutoConfiguration啟動(dòng)自動(dòng)配置機(jī)制,他會(huì)掃描spring.factories文件中配置的自動(dòng)配置類,并通過條件注解(如@ConditionalOnClass @ConditionalOnMissingBean)決定是否加載這些配置類。
-
條件注解:?自動(dòng)配置類中使用條件注解來控制配置的生效,常見的條件注解有:
-
@ConditionalOnClass:?當(dāng)類路徑下存在指定的類時(shí),配置才會(huì)生效。
-
@ConditionalOnMissingClass:?當(dāng)Spring容器中沒有指定類型的bean時(shí),才會(huì)創(chuàng)建Bean.
-
@ConditionalOnProperty:?當(dāng)配置文件中存在特定的屬性時(shí),配置才會(huì)生效。
?例如,Spring Boot 提供的 DataSource
自動(dòng)配置類 DataSourceAutoConfiguration
:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic DataSource dataSource(DataSourceProperties properties) {// 創(chuàng)建 DataSource Bean}
}
當(dāng)項(xiàng)目中引入了數(shù)據(jù)庫依賴(如 HikariCP
),DataSourceAutoConfiguration
會(huì)自動(dòng)配置一個(gè) DataSource
對(duì)象。
@SpringBootApplication
注解詳解
?@SpringBootApplication
是一個(gè)組合注解,通常放在主啟動(dòng)類上:
@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}
其中包含了:
@SpringBootConfiguration
:等價(jià)于@Configuration
,標(biāo)識(shí)該類為配置類。@EnableAutoConfiguration
:啟用 Spring Boot 的自動(dòng)配置機(jī)制。@ComponentScan
:掃描該類所在包及其子包中的@Component
、@Service
、@Repository
等注解。
?自定義配置和自動(dòng)配置的關(guān)系
在使用自動(dòng)裝配時(shí),可以通過手動(dòng)定義的 @Bean
、@Configuration
優(yōu)先覆蓋自動(dòng)配置類中的默認(rèn)配置。例如,自定義一個(gè) DataSource
:
@Configuration
public class CustomDataSourceConfig {@Beanpublic DataSource customDataSource() {return new HikariDataSource();}
}
這樣,即使自動(dòng)配置類中也定義了 DataSource
,但由于 @ConditionalOnMissingBean
的存在,自定義的 DataSource
會(huì)優(yōu)先被加載。
定制自動(dòng)配置:可以通過以下幾種方式定制 Spring Boot 的自動(dòng)配置:
@ConditionalOnProperty
:通過屬性控制自動(dòng)配置的啟用或禁用。例如,通過設(shè)置spring.datasource.enabled=false
可以禁用數(shù)據(jù)源的自動(dòng)配置。- 自定義
@Configuration
類:可以通過編寫自定義的@Configuration
類來覆蓋默認(rèn)的自動(dòng)配置。 @Import
:可以手動(dòng)導(dǎo)入一些自動(dòng)配置類來精確控制自動(dòng)配置的內(nèi)容。
常見的自動(dòng)裝配場(chǎng)景
- 數(shù)據(jù)庫配置:通過引入
spring-boot-starter-data-jpa
或spring-boot-starter-jdbc
,Spring Boot 自動(dòng)配置數(shù)據(jù)源、JPA 實(shí)體管理等。 - Web 框架配置:引入
spring-boot-starter-web
,Spring Boot 會(huì)自動(dòng)配置DispatcherServlet
、Jackson
JSON 解析器等。 - 消息隊(duì)列配置:引入
spring-boot-starter-amqp
,自動(dòng)配置 RabbitMQ 連接工廠、模板和監(jiān)聽器容器。
?總結(jié)
Spring Boot 的自動(dòng)裝配極大地簡(jiǎn)化了 Spring 應(yīng)用的開發(fā):
- 減少配置文件:開發(fā)者不需要在
XML
或 Java 配置類中顯式配置每個(gè)組件,Spring Boot 會(huì)根據(jù)類路徑中的依賴自動(dòng)加載相應(yīng)的配置。 - 減少樣板代碼:在傳統(tǒng)的 Spring 應(yīng)用中,我們可能需要編寫很多
@Configuration
類來設(shè)置數(shù)據(jù)源、事務(wù)管理器、視圖解析器、消息轉(zhuǎn)換器等。但在 Spring Boot 中,大部分常見的配置都是自動(dòng)配置好的,開發(fā)者只需要關(guān)注業(yè)務(wù)邏輯。例如,若要使用 Spring MVC,傳統(tǒng) Spring 需要配置 DispatcherServlet 和 ViewResolver 等,但在 Spring Boot 中,只需要在類路徑中添加spring-boot-starter-web
依賴即可,Spring Boot 會(huì)自動(dòng)配置這些組件。 - 按需加載:通過條件注解和
spring.factories
文件,Spring Boot 只加載需要的配置。 - 可擴(kuò)展性強(qiáng):可以通過自定義配置或修改
application.properties
文件中的屬性,靈活調(diào)整自動(dòng)配置的行為。