Spring Boot的自动配置功能可以根据我们添加的jar依赖项自动配置Spring应用程序。

例如,如果在类路径中存在H2数据库jar包,并且我们没有手动配置与数据库相关的bean,那么Spring Boot的自动配置功能会自动在项目中进行配置。

我们可以通过使用注解@EnableAutoConfiguration来启用自动配置功能。但实际上,在@SpringBootApplication注解中已经包含了@EnableAutoConfiguration注解,@SpringBootApplication是三个注解的组合:@ComponentScan、@EnableAutoConfiguration和@Configuration。因此,我们可以直接使用@SpringBootApplication注解,而不用单独使用@EnableAutoConfiguration。

@SpringBootApplication=@ComponentScan+@EnableAutoConfiguration+@Configuration

当我们在项目中添加了spring-boot-starter-web依赖项时,Spring Boot自动配置会检查类路径上是否有Spring MVC。它会自动配置dispatcherServlet、默认的错误页面和web jars。

同样地,当我们添加了spring-boot-starter-data-jpa依赖项时,Spring Boot自动配置会自动配置数据源和实体管理器(Entity Manager)。

所有的自动配置逻辑都实现在spring-boot-autoconfigure.jar中。
83bd7e17804b5c66436b877b6ba631b.png

自动配置的需求

Spring基于Java的应用程序需要大量的配置。当我们使用Spring MVC时,我们需要配置dispatcher servlet、视图解析器、web jars等。下面是一个典型的Web应用程序中配置dispatcher 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>  

Spring Boot自动配置

Spring Boot的自动配置功能可以根据我们添加的jar依赖项自动配置Spring应用程序。

例如,如果在类路径中存在H2数据库jar包,并且我们没有手动配置与数据库相关的bean,那么Spring Boot的自动配置功能会自动在项目中进行配置。

我们可以通过使用注解@EnableAutoConfiguration来启用自动配置功能。但实际上,在@SpringBootApplication注解中已经包含了@EnableAutoConfiguration注解,@SpringBootApplication是三个注解的组合:@ComponentScan、@EnableAutoConfiguration和@Configuration。因此,我们可以直接使用@SpringBootApplication注解,而不用单独使用@EnableAutoConfiguration。

@SpringBootApplication=@ComponentScan+@EnableAutoConfiguration+@Configuration

当我们在项目中添加了spring-boot-starter-web依赖项时,Spring Boot自动配置会检查类路径上是否有Spring MVC。它会自动配置dispatcherServlet、默认的错误页面和web jars。

同样地,当我们添加了spring-boot-starter-data-jpa依赖项时,Spring Boot自动配置会自动配置数据源和实体管理器(Entity Manager)。

所有的自动配置逻辑都实现在spring-boot-autoconfigure.jar中。

自动配置的需求

Spring基于Java的应用程序需要大量的配置。当我们使用Spring MVC时,我们需要配置dispatcher servlet、视图解析器、web jars等。下面是一个典型的Web应用程序中配置dispatcher servlet的代码:

xml
Copy code
<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>

类似地,当我们使用Hibernate/JPA时,我们需要配置数据源、事务管理器、实体管理器工厂等。

配置数据源:

<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>  

配置实体管理器工厂:

 <bean  
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  
id="entityManagerFactory">  
<property name="persistenceUnitName" value="hsql_pu" />  
<property name="dataSource" ref="dataSource" />  
</bean>  

配置事务管理器:

<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"/>  

禁用自动配置类

我们也可以禁用特定的自动配置类,如果我们不希望它们被应用。我们可以使用@EnableAutoConfiguration注解的exclude属性来禁用自动配置类。例如:

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属性,并指定类的限定名,以防止类不在类路径上。我们可以通过spring.autoconfigure.exclude属性来排除任意数量的自动配置类。

Spring Boot自动配置示例

在下面的示例中,我们将看到Spring Boot的自动配置功能是如何工作的。

步骤1:打开Spring Initializr https://start.spring.io/

步骤2:提供Group名称。我们提供cn.javatiku。

步骤3:提供Artifact Id。我们提供spring-boot-autoconfiguration-example。

步骤4:添加依赖项:Spring Web、Spring Data JPA和H2数据库。

步骤5:单击Generate按钮。当我们单击Generate按钮时,它会将项目打包成JAR文件并下载到本地系统中。
b0859401bd75c34c823aa062fdeb27f.png

步骤6:解压缩JAR文件并将其粘贴到STS工作区。

步骤7:将项目文件夹导入到STS中。

文件->导入->现有的Maven项目->浏览->选择文件夹spring-boot-autoconfiguration-example->完成

导入过程可能需要一些时间。

步骤8:在src/main/java文件夹中创建一个名为cn.javatiku.controller的包。

步骤9:在cn.javatiku.controller包中创建一个名为ControllerDemo的Controller类。

ControllerDemo.java

package cn.javatiku.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文件夹中创建另一个名为cn.javatiku.model的包。

步骤11:在cn.javatiku.model包中创建一个名为User的类。

User.java

package cn.javatiku.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 + "]";  
}  
}  

现在我们需要配置H2数据库。

步骤12:打开application.properties文件并配置以下内容:端口、启用H2控制台、数据源和URL。

application.properties

server.port=8085  
spring.h2.console.enabled=true  
spring.datasource.plateform=h2  
spring.datasource.url=jdbc:h2:mem:javatpoint  

步骤13:在src/main/resources文件夹中创建一个SQL文件。

右键单击文件夹src/main/resources->新建->文件->提供文件名->完成

我们提供了文件名data.sql,并在其中插入以下数据。

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文件夹中创建一个名为webapp的文件夹。

步骤15:在webapp文件夹中创建一个JSP文件,其名称与ControllerDemo中返回的名称相同。在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:运行SpringBootAutoconfigurationExampleApplication.java文件。我们可以在控制台看到应用程序在端口8085上成功运行。
327930905657a0dda6c576c2c3ae69c.png

步骤17:打开浏览器并调用URL http://localhost:8085/h2-console/。它显示了在application.properties文件中配置的驱动程序类、JDBC URL和默认用户名sa。
73a9f0420ac8d7d761c37cb52504f6b.png

我们还可以通过单击Test Connection按钮来测试连接。如果连接成功,它会显示Test Successful的消息。

步骤18:单击Connect按钮。它显示了我们在User.java文件中定义的userdata表的结构。
e3a659b9c1c8f2db35ddf855cb3038e.png

步骤19:执行以下查询以查看我们在data.sql文件中插入的数据。

SELECT * FROM USERDATA;

705f8b4b30dfd19d76e0e8092449f64.png

让我们仔细查看控制台。我们可以看到TransactionManagement、DispatcherServlet、EntityManagerFactory和DataSource都已自动配置,如下图所示。
2a00af5d8a75c05a09885d5b6aef8d9.png

调试自动配置

我们可以通过以下两种方式找到有关自动配置的更多信息:

打开调试日志记录
使用Spring Boot Actuator

打开调试日志记录

我们可以通过在application.properties文件中添加属性来进行调试日志记录。让我们在上面的示例中实现调试日志记录。打开application.properties文件并添加以下属性:

logging.level.org.springframework: DEBUG

现在重新启动应用程序。我们会看到日志中打印了一个自动配置报告。报告包含所有已自动配置的类。它分为两部分:positive matches(正匹配)和negative matches(负匹配),如下图所示。

正匹配

a2710399a83ceb0cca077a7775361b0.png

负匹配
de2d3dc734fcb1ace8ffa1fb91c1e70.png

Spring Boot Actuator

我们还可以使用Actuator来调试自动配置。我们还将在其中添加HAL浏览器以简化操作。它显示了所有自动配置的bean和未配置的bean的详细信息。

让我们创建一个Spring Boot Actuator的示例。

步骤1:打开Spring Initializr http://start.spring.io

步骤2:提供Group名称。我们提供cn.javatiku。

步骤3:提供Artifact Id。我们提供actuator-autoconfiguration-example。

步骤4:添加依赖项: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按钮。它将所有与项目相关的规范绑定到一个jar文件,并下载到我们的本地系统中。

步骤6:解压缩下载的jar文件。

步骤7:使用以下步骤导入项目文件夹:

文件->导入->现有的Maven项目->下一步->浏览->选择项目文件夹->完成

导入项目后,我们可以在IDE的包资源管理器(Package Explorer)部分看到以下目录结构。55dc739c10fa1b4d36a061477392ee1.png

步骤8:在cn.javatiku包中创建一个Controller类。我们创建了一个名为DemoRestController的Controller类。

在Controller中,我们定义了一个名为hello()的方法,它返回一个字符串。

DemoRestController.java

package cn.javatiku;  
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:运行ActuatorAutoConfigurationExampleApplication.java文件。

步骤10:打开浏览器并调用URL http://localhost:8080/hello。它返回了我们在Controller中指定的字符串。
1cd95a7bc15a29c1c66b40f1e5f8d76.png
现在调用actuator URL http://localhost:8080/actuator。它启动了actuator,显示了三个URL: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 Browser依赖。

<dependency>  
<groupId>org.springframework.data</groupId>  
<artifactId>spring-data-rest-hal-browser</artifactId>  
</dependency>  

步骤12:再次运行ActuatorAutoConfigurationExampleApplication.java文件。

要访问HAL浏览器,将http://localhost:8080输入到浏览器中并按回车键。

bfd365bbae9e7e0bc8a7a3a0cea5e42.png

现在我们可以通过HAL浏览器访问actuator。

在资源管理器的文本框中输入/actuator,然后单击Go按钮。
eefdec81c78315e3bb5955644e63716.png
它显示了与actuator相关的所有内容。在actuator中最重要的是beans。
070d2672bb409d9d7f69429d24f074e.png

当我们点击bean的箭头时,它会显示在Spring Boot项目中配置的所有bean的详细信息。

580085ae82b6d74ea46b67d3c6bc4bf.png
上图显示了所有已自动配置的bean和未配置的bean的详细信息。

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术