SpringBoot学习总结

一、SpringBoot概述

1. SpringBoot特点

为基于Spring的开发提供更快的入门体验,并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式,内部集成了很多的其他框架,并且做好了默认的配置。

2. SpringBoot的核心功能

  • 起步依赖
    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
    简单的说,起步依赖就是将具备某种功能的坐标打包到一起,例如spring-boot-starter-xxx(spring-boot-starter-web),并提供一些默认的功能。
  • 自动配置
    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。在引入依赖之后,Springboot就认为我们需要使用到一些相关的技术,maven就会自动去加载相关的jar包依赖,就会自动加载默认的配置。

二、SpringBoot原理分析

1. 起步依赖

1.1 分析spring-boot-starter-parent

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml

<parent> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-dependencies</artifactId> 
	<version>2.0.1.RELEASE</version> 
	<relativePath>../../spring-boot-dependencies</relativePath> 
</parent>

这里spring-boot-starter-parent也依赖了父坐标(也就是原来pom.xml的爷爷);
此外还可以看到如下信息:

<includes>
  <include>**/application*.yml</include>
  <include>**/application*.yaml</include>
  <include>**/application*.properties</include>
</includes>

可以知道配置文件的命名规则以及加载顺序,假如同时有application.yml与application.properties,则先加载.yml再加载.properties,后加载的属性会覆盖前面相同的属性的值

按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的 pom.xml:一部分坐标的版本、依赖管理、插件管理已经定义好,所以SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。

1.2 分析spring-boot-starter-web

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,同时也内置了tomcat服务器,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

2. 自动配置原理解析

按住Ctrl点击查看启动类SpringBootApplication上的注解@SpringBootApplication

@SpringBootApplication
public class SpringbootApplication {

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

}
@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 {
	...
}

@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类
@EnableAutoConfiguration:SpringBoot自动配置功能开启

按住Ctrl点击查看注解@EnableAutoConfiguration

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
@AutoConfigurationPackage 
@Import(AutoConfigurationImportSelector.class) 
public @interface EnableAutoConfiguration {
 ... ... ... 
 }

其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类

AutoConfigurationImportSelector源码中

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表,spring.factories 文件中配置着有关自动配置的配置信息:以Configuration为结尾的类名称,这些类就是存有自动配置信息的类,而SpringApplication在获取这些类名后再加载。

三、SpringBoot整合Spring Data JPA

1. 添加Spring Data JPA的起步依赖和数据库驱动依赖

<!-- springBoot JPA的起步依赖 --> 
<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency>

<!-- MySQL连接驱动 --> 
<dependency> 
	<groupId>mysql</groupId> 
	<artifactId>mysql-connector-java</artifactId> 
</dependency>

2. 在application.properties中配置数据库和jpa的相关属性

#DB Configuration: 
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8 
spring.datasource.username=root 
spring.datasource.password=root 

#JPA Configuration: 
spring.jpa.database=MySQL 
spring.jpa.show-sql=true 
spring.jpa.generate-ddl=true 
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

3. 创建实体配置实体

@Entity
@Table(name = "user")
public class User {
 // 主键 
 @Id 
 @GeneratedValue(strategy = GenerationType.IDENTITY) 
 private Long id; 

// 用户名 
private String username; 
// 密码 
private String password; 
// 姓名 
private String name; 

//此处省略setter和getter方法... ... 
}

4. 编写UserRepository

public interface UserRepository extends JpaRepository<User,Long>{
	public List<User> findAll(); 
}

5. 测试

@RunWith(SpringRunner.class) 
@SpringBootTest(classes=SpringBootApplication.class) 
public class JpaTest {
	@Autowired 
	private UserRepository userRepository; 
	
	@Test 
	public void test(){ 
		List<User> users = userRepository.findAll(); 
		System.out.println(users); 
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值