SpringBoot

1.入门程序

入门程序相当简单,只要三步

  1. 创建一个普通工程
  2. 引入依赖
  3. 编写controller

一、创建一个普通工程
在这里插入图片描述

二、引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast.springboot</groupId>
    <artifactId>itcast-springboot</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 所有的springboot的工程都以spring父工程为父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

三、编写controller


@RestController
@EnableAutoConfiguration
public class HelloController {

    @GetMapping("show")
    public String test(){
        return "hello Spring Boot!";
    }

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

1.1 spring-boot-starter-parent

  所有SpringBoot项目要继承的项目定义了若干个坐标版本号依赖管理而非依赖以达到减少依赖冲突的目的

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.6.RELEASE</version>
</parent>

  它的作用是对常用的依赖进行版本管理,以便引入依赖时可以省略版本号需要注意: spring-boot-starter-parent2.5.0与 spring-boot-starter-parent2.4.6共计57处坐标版本不同


1.2 启动器

  Springboot包含许多启动项目并快速运行所需的依赖项并且具有一组受支持的被管理的传递性依赖项所有的正式starter都遵循类似的命名模式spring-boot-starter-*

  starter启动器是一组方便的依赖项描述符可以在pom中引入其依赖免去了自己需要引用很多依赖类并且SpringBoot会自动进行类的自动配置。

例如我们引入spring-boot-starter-web(web启动器)

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

实际上我们可以看到这一个启动器中就包含了这么多的依赖
在这里插入图片描述

想了解更多的启动器,可以参考:Spring Boot启动器


1.3 @EnableAutoConfiguration

  之前我们如果要访问一个Controller,是比较麻烦的.要配置DispatchServlet,还要去初始化SpringMvc容器,后期到了Spring3.0版本后,我们有了注解配置,但依旧需要配置不少东西

官网翻译

开启spring应用程序的自动配置SpringBoot基于你所添加的依赖和你自己定义的bean试图去猜测并配置你想要的配置。比如我们引入了spring-boot-starter-web而这个启动器中帮我们添加了tomcat、SpringMVC的依赖。此时自动配置就知道你是要开发一个web应用所以就帮你完成了web及SpringMVC的默认配置了

  总结SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置这些配置是否生效取决于我们是否引入了对应库所需的依赖如果有那么默认配置就会生效。


1.4 如何注册多个Controller?

  如果我们有另一个controller,应该怎么访问呢?难道要在每一个Controller中都添加一个main方法和@EnableAutoConfiguration注解这样启动一个springboot程序也太麻烦了。
  也无法同时启动多个Controller因为每个main方法都监听8080端口。所以一个springboot程序应该只有一个springboot的main方法。

  所以springboot程序引入了一个全局的引导类


1.5 引导类

  通常请求下我们在一个springboot工程中都会在基包下创建一个引导类一些springboot的全局注解@EnableAutoConfiguration注解以及springboot程序的入口main方法都放在该类中。

一、在根目录下, 创建引导类
  我们还需要添加@ComponentScan来扫描

@EnableAutoConfiguration
@ComponentScan
public class TestApplication {

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

官网描述:

配置组件扫描的指令。提供了类似与context:component-scan标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性那么将从声明这个注解的类所在的包开始扫描包及子包

  而我们的@ComponentScan注解声明的类就是main函数所在的启动类因此扫描的包是该类所在包及其子包。一般启动类会放在一个比较浅的包目录中。

二、并修改HelloController

@RestController
public class HelloController {

    @GetMapping("show")
    public String test(){
        return "hello Spring Boot!";
    }
}

2.完整的SpringBoot项目

2.1 启动类

一、启动类上添加@SpringBootApplication

@SpringBootApplication
public class TestApplication {

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

}

使用@SpringBootApplication替代@EnableAutoConfiguration和@ComponentScan注解
在这里插入图片描述

  • @EnableAutoConfiguration开启自动配置
  • @ComponentScan开启注解扫描
  • @SpringBootConfiguration ???

二、@SpringBootConfiguration
在这里插入图片描述
  @Configuration这个注解的作用就是声明当前类是一个配置类然后Spring会自动扫描到添加了@Configuration的类并且读取其中的配置信息。而@SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类项目中只能有一个。所以一般我们无需自己添加。


2.2 使用java配置组件(定义bean)

  springboot的默认配置方式和我们之前玩的配置方式不太一样没有任何的xml, 例如数据库连接池,之前是这么配的

<!-- 配置连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

  现在我们可以使用更优雅的java配置方式

一、引入依赖

<dependency>
    <groupId>com.github.drtrang</groupId>
    <artifactId>druid-spring-boot2-starter</artifactId>
    <version>1.1.10</version>
</dependency>

二、添加jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/leyou
jdbc.username=root
jdbc.password=123

三、配置数据源
  之前配置的@ComponentScan此时就可以通过@Configuration注解扫描到此配置类
  普通配置类的作用就是为了给Spring容器装载Bean

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {

    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}
  • @Configuration:声明为配置类
    • 配置类的作用就是替代application.xml,我们使用配置类来定位bean,交给容器管理
  • @PropertySource:引入属性文件
    • 通过@Value + ${}可以在Spring容器的所有位置(配置类、bean)中注入值
  • @Bean:相当于以前的bean标签
    • Spring会自动调用该方法将方法的返回值加入Spring容器中
    • @Bean支持直接在传参中注入对象(按类型注入)

然后就可以在任意位置通过@Autowired注入DataSource了


2.3 SpringBoot的属性注入

  上面案例中,我们注入属性使用了@Value注解,这种方式不够强大,在SpringBoot中,提供了一种新的属性注入方式,支持java基本类型以及复杂类型注入

  1. 创建属性读取类
  2. 在配置类(在JdbcConfiguratio)中使用这个属性

一、创建属性读取类

@ConfigurationProperties(prefix = "jdbc")
@Data
public class JdbcProperties {
    private String url;
    private String driverClassName;
    private String username;
    private String password;
}
  • @ConfigurationProperties 注解声明当前类为属性读取类
    • prefix="jdbc"读取属性文件中前缀为jdbc的值。
    • 在类上定义各个属性名称必须与属性文件中jdbc.后面部分一致并且必须具有getter和setter方法

二、在配置类(在JdbcConfiguratio)中使用这个属性

@Configuration
@PropertySource("classpath:jdbc.properties")
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {

    @Autowired
    private JdbcProperties jdbcProperties;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbcProperties.getDriverClassName());
        dataSource.setDriverClassName(jdbcProperties.getUrl());
        dataSource.setUsername(jdbcProperties.getUsername());
        dataSource.setPassword(jdbcProperties.getPassword());
        return dataSource;
    }
	
	// @Bean方法的参数注入(更推荐)
	@Bean
    //public DataSource dataSource(JdbcProperties jdbcProperties) {
        // ...
    //}
}
  • @EnableConfigurationProperties 声明要使用指定属性读取类

三、扩展内容:默认读取的资源文件
以我们把jdbc.properties名称改为application.properties, 此时我们不用指定属性文件

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: Spring