SpringBoot自動(dòng)配置根據(jù)我們添加的jar依賴項(xiàng)自動(dòng)配置SpringBoot應(yīng)用程序。
例如,如果類路徑中存在H2數(shù)據(jù)庫Jar,而我們尚未手動(dòng)配置任何與數(shù)據(jù)庫相關(guān)的bean,則Spring Boot的自動(dòng)配置功能會(huì)在項(xiàng)目中自動(dòng)對(duì)其進(jìn)行配置。
我們可以啟用自動(dòng)通過使用注解 @EnableAutoConfiguration 配置功能。但是此注解不使用,因?yàn)樗b在 @SpringBootApplication 注解內(nèi)。注解@SpringBootApplication是三個(gè)注解的組合: @ComponentScan,@EnableAutoConfiguration,和 @Configuration 。但是,我們使用@SpringBootApplication批注而不是使用@EnableAutoConfiguration。
@SpringBootApplication = @ComponentScan + @EnableAutoConfiguration + @Configuration
當(dāng)添加 在項(xiàng)目中使用spring-boot-starter-web 依賴項(xiàng)時(shí),Spring Boot自動(dòng)配置會(huì)在類路徑中查找Spring MVC。它會(huì)自動(dòng)配置 dispatcherServlet ,默認(rèn)的 錯(cuò)誤頁面和 網(wǎng)絡(luò)罐子。
類似地,當(dāng)我們添加spring-boot-starter-data-jpa 依賴關(guān)系,我們看到Spring Boot自動(dòng)配置會(huì)自動(dòng)配置 數(shù)據(jù)源和 實(shí)體管理器。
所有自動(dòng)配置邏輯都在 spring-boot-autoconfigure.jar 中實(shí)現(xiàn),如下圖所示。
基于Spring的應(yīng)用程序需要很多配置。使用Spring MVC時(shí),我們需要配置 dispatcher servlet,視圖解析器,Web jars 。以下代碼顯示了Web應(yīng)用程序中調(diào)度程序servlet的典型配置:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
類似地,當(dāng)我們使用Hibernate/JPA時(shí),我們需要配置數(shù)據(jù)源,事務(wù)管理器,實(shí)體管理器工廠等等。
配置數(shù)據(jù)源
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database>
配置實(shí)體管理器工廠
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean>
配置事務(wù)管理器
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
如果我們不想被應(yīng)用,我們還可以禁用特定的自動(dòng)配置類。我們使用注解@EnableAutoConfiguration的 exclude 屬性來禁用自動(dòng)配置類。例如:
import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*; @Configuration(proxyBeanMethods = false) @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
如果類不在類路徑中,我們可以使用@EnableAutoConfiguration批注的屬性 excludeName 并指定類的 qualified 名稱。我們可以使用屬性 spring.autoconfigure.exclude 排除任何數(shù)量的自動(dòng)配置類。
在以下示例中,我們將看到Spring Boot的自動(dòng)配置功能如何工作。
步驟1: 打開spring Initializr https://start.spring.io/。
第2步: 組名稱。我們提供了 com.nhooo 。
步驟3: 提供 工件 ID。我們提供了 spring-boot-autoconfiguration-example 。
步驟4: 添加依賴項(xiàng): Spring Web,Spring Data JPA,一個(gè) H2數(shù)據(jù)庫。
步驟5: 單擊 Generate (生成)按鈕。當(dāng)我們單擊"生成"按鈕時(shí),它會(huì)將項(xiàng)目包裝在 Jar 文件中,并將其下載到本地系統(tǒng)。
第6步: 提取 Jar文件并將其粘貼到STS工作區(qū)中。
步驟7: 將項(xiàng)目文件夾導(dǎo)入STS。
文件->導(dǎo)入->現(xiàn)有Maven項(xiàng)目->瀏覽->選擇文件夾spring-boot-autoconfiguration-example->完成
導(dǎo)入需要一些時(shí)間。
步驟8: 在目錄中創(chuàng)建名稱為 com.nhooo.controller 的程序包。文件夾 src/main/java 。
步驟9: 在包中創(chuàng)建名稱為 ControllerDemo 的Controller類。 strong> com.nhooo.controller 。
ControllerDemo.java
package com.nhooo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ControllerDemo { @RequestMapping("/") public String home() { return "home.jsp"; } }
步驟10: 在文件夾 src/main/java 中創(chuàng)建另一個(gè)名為 com.nhooo.model 的包。 p>
User.java
package com.nhooo.model; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="userdata") public class User { @Id private int id; private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUname() { return username; } public void setUname(String username) { this.username = username; } @Override public String toString() { return "User [id=" + id + ", uname=" + username + "]"; } }
現(xiàn)在,我們需要配置H2數(shù)據(jù)庫。
步驟12: 打開 application.properties 文件并配置以下內(nèi)容: 端口,啟用H2控制臺(tái),數(shù)據(jù)源,和 URL。
application.properties
server.port=8085 spring.h2.console.enabled=true spring.datasource.plateform=h2 spring.datasource.url=jdbc:h2:mem:nhooo
步驟13: 在文件夾 src/main/resources中創(chuàng)建一個(gè) SQL 文件。
右鍵單擊src/main/resources文件夾->新建->文件->提供文件名->完成
我們提供了文件名 data.sql 并將以下數(shù)據(jù)插入其中。
data.sql
insert into userdata values(101,'Tom'); insert into userdata values(102,'Andrew'); insert into userdata values(103,'Tony'); insert into userdata values(104,'Bob'); insert into userdata values(105,'Sam');
步驟14: 在 src 文件夾中創(chuàng)建一個(gè)名稱為 webapp 的文件夾。
步驟15: 使用我們?cè)? ControllerDemo 中返回的名稱創(chuàng)建一個(gè)JSP文件。在ControllerDemo.java中,我們返回了 home.jsp 。
home.jsp
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="addUser"> ID :<br /> <input type="text" name="t1"><br /> User name :<br /> <input type="text" name="t2"><br /> <input type="submit" value="Add"> </form> </body> </html>
步驟16: 運(yùn)行 SpringBootAutoconfigurationExampleApplication.java 文件。我們可以在控制臺(tái)中看到我們的應(yīng)用程序已成功在端口 8085 上運(yùn)行。
步驟17: 打開瀏覽器并調(diào)用URL http: //localhost: 8085/h2-console/。它顯示了我們?cè)? application.properties 文件中配置的 驅(qū)動(dòng)程序類, JDBC URL ,以及默認(rèn)的用戶名 sa 。
我們還可以通過以下方式測(cè)試連接點(diǎn)擊 測(cè)試連接按鈕。如果連接成功,則顯示消息 測(cè)試成功。
步驟18: 單擊 連接按鈕。它顯示了我們?cè)赨ser.java文件中定義的表 userdata 的結(jié)構(gòu)。
步驟19: 執(zhí)行以下查詢,以查看我們已插入 data.sql 文件中的數(shù)據(jù)
SELECT * FROM USERDATA;
讓我們仔細(xì)看一下控制臺(tái)。我們看到 TransactionManagement,DispatcherServlet,EntityManagerFactory,和 DataSource 會(huì)自動(dòng)配置,如下圖所示。
我們可以通過以下方法找到有關(guān)自動(dòng)配置的更多信息: 使用以下兩種方式:
打開調(diào)試日志記錄 使用Spring Boot執(zhí)行器打開調(diào)試日志記錄
我們可以通過在 application.properties 中添加屬性來調(diào)試日志記錄文件。讓我們?cè)谏厦娴氖纠袑?shí)現(xiàn)調(diào)試日志記錄。打開 application.properties 文件并添加以下屬性:
logging.level.org.springframework: DEBUG
現(xiàn)在重新啟動(dòng)應(yīng)用程序。我們看到在日志中打印了一個(gè)自動(dòng)配置報(bào)告。該報(bào)告包括所有自動(dòng)配置的類。分為兩部分: 正向匹配和 負(fù)向匹配,如下圖所示。
正向匹配
否定匹配
Spring Boot執(zhí)行器
我們還可以通過在項(xiàng)目中使用 Actuator 調(diào)試自動(dòng)配置。我們還將添加 HAL瀏覽器,以簡(jiǎn)化操作。
讓我們創(chuàng)建一個(gè)Spring Boot Actuator示例。
步驟1: 打開Spring Initializr http://start.spring.io 。
步驟2: 提供 組名稱。我們提供了 com.nhooo。
步驟3: 提供 工件 ID。我們提供了 執(zhí)行器自動(dòng)配置示例。
步驟4: 添加依賴項(xiàng): Spring Web 和 Spring Boot Actuator。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
步驟5: 單擊 Generate (生成)按鈕。它將與項(xiàng)目相關(guān)的所有規(guī)范綁定到一個(gè) jar 文件中,并將其下載到我們的本地系統(tǒng)中。
步驟6: 提取下載的jar文件。
步驟7: 使用以下步驟導(dǎo)入項(xiàng)目文件夾:
文件->導(dǎo)入->現(xiàn)有Maven項(xiàng)目->下一步->瀏覽- >選擇項(xiàng)目文件夾->完成
導(dǎo)入項(xiàng)目后,我們可以在IDE的 Package Explorer 部分中看到以下目錄結(jié)構(gòu)。
步驟8: 在包中創(chuàng)建Controller類 com.nhooo。我們創(chuàng)建了一個(gè)名為 DemoRestController的控制器類。
在Controller中,我們定義了一個(gè)名為 hello( ),它返回一個(gè)字符串。
DemoRestController.java
package com.nhooo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoRestController { @GetMapping("/hello") public String hello() { return "Hello User, have a nice day."; } }
步驟9: 運(yùn)行 ActuatorAutoConfigurationExampleApplication.java 文件。
步驟10: 打開瀏覽器并調(diào)用URL
http: //localhost: 8080/hello 。它返回我們?cè)诳刂破髦兄付ǖ淖址?/p>
現(xiàn)在調(diào)用執(zhí)行器URL http: //localhost: 8080/actuator 。它將啟動(dòng)顯示以下三個(gè)URL的執(zhí)行器: self , health 和 info ,如下所示。
{"_links":{"self":{"href":"http://localhost:8080/actuator","templated":false},"health":{"href":"http://localhost:8080/actuator/health","templated":false},"health-path":{"href":"http://localhost:8080/actuator/health/{*path}","templated":true},"info":{"href":"http://localhost:8080/actuator/info","templated":false}}}
步驟11: 打開 pom.xml 文件并添加 HAL瀏覽器依賴項(xiàng)。
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-rest-hal-browser</artifactId> </dependency>
步驟12: 再次,運(yùn)行 ActuatorAutoConfigurationExampleApplication.java 文件。
要訪問HAL瀏覽器,請(qǐng)鍵入 http://localhost:8080 在瀏覽器中,然后按Enter鍵。
現(xiàn)在我們可以通過HAL瀏覽器訪問執(zhí)行器。
在資源管理器的文本框中鍵入 /actuator ,然后單擊 Go >按鈕。
它顯示了與執(zhí)行器。執(zhí)行器中最重要的是 beans 。
當(dāng)我們單擊bean的箭頭時(shí),它會(huì)顯示所有
以上該圖顯示了所有自動(dòng)配置的 beans 的詳細(xì)信息。