SpringBoot HelloWorld

初识SpringBoot

SpringBoot HelloWorld

1、SpringBoot特点

1.1、依赖管理

  • 父项目做依赖管理

    依赖管理
    	<parent>
            <artifactId>spring-boot-starter-parent</artifactId>
            <groupId>org.springframework.boot</groupId>
            <version>2.5.5</version>
        </parent>
    他的父项目:
    	<parent>
        	<groupId>org.springframework.boot</groupId>
        	<artifactId>spring-boot-dependencies</artifactId>
        	<version>2.5.5</version>
      	</parent>
    几乎声明了所有开发中常用的依赖的版本号
    
  • 开发导入starter场景启动器

    spring-boot-starter-web
    
    1、spring-boot-starter :springBoot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
    
    2、SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器) ,只需要在项目里面引入这些starters相关场景的所有依赖都会导入进来。要用什么就导入什么场景的启动器。
    
    3、所有的场景启动器模块最底层的依赖:
            <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter</artifactId>
              <version>2.5.5</version>
              <scope>compile</scope>
            </dependency>
    

    4、SpringBoot所有支持的场景:

    https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

  • 无需关注版本号,自动版本仲裁

    • 引入的非本仲裁的jar,要写版本号
  • 可以修改版本号

1、查看spring-boot-dependencies里面规定当前依赖的版本用的key
2、在当前项目里面重写配置
<!--    修改默认的版本号,改成自己想要的-->
    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>

1.2、自动配置

  • 自动配置好Tomcat

    • 引入Tomcat依赖
    • 配置Tomcat
  • 自动配置好SpringMVC

    • 引入SpringMVC的全套组件
    • 自动配置好SpringMVC常用组件
  • 自动配置好Web常见的功能,如:字符编码问题

    • SpringBoot帮我们配置好了所有web开发的场景场景
  • 默认的包结构

    • 主程序所在的包及其所有子包里面的组件都会被默认扫描进来

    • 无需以前的包扫描配置

    • 想要改变扫描路径:@SpringBootApplication(scanBasePackages = “com”)

    • 或者 @ComponentScan指定扫描路径

      一个@SpringBootApplication
          等同于
      		@SpringBootConfiguration
      		@EnableAutoConfiguration
      		@ComponentScan("com")
      
  • 各种配置拥有默认值

  • 按需要加载所有自动配置项

    • 虽然场景的所有自动配置启动的时候默认会全部
    • 按照条件装配规则,最终会按需配置

环境准备

1、MAVEN设置
2、DEA设置

Springboot: HelloWorld

1、创建maven项目

2、添加SpringBoot相关的依赖

    //继承父类依赖
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.5.5</version>
    </parent>
    
    //导入web模块依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency> 
    </dependencies>

3、创建主程序:启动Spring boot应用

@SpringBootApplication       //标注这是一个主程序,说明这是一个springboot应用
public class HelloWorldApplication {    
    
    public static void main(String[] args) {    
        //Spring应用启动起来    
        SpringApplication.run(HelloWorldApplication.class,args);    
    }
    
}

4、编写相关的Controller、Service

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
          return "helloWorld";
    }

}

5、运行主程序测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jeIX72tU-1635054821089)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1634627459631.png)]

6、简化部署

<!--    这个插件,可以将应用打包成一个可执行文件的jar包-->
    <build>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
    </build>

将这个应用打包成jar包,直接使用java -jar的命令进行执行;

Hello World探究

### 1.POM文件

		#### 1、父项目
我们引入的父项目    
	<parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.5.5</version>
    </parent>
他的父项目是:
	<parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-dependencies</artifactId>
    	<version>2.5.5</version>
  	</parent>
他是真正管理Spring Boot应用里面的所有依赖版本号:
	

Spring Boot的版本仲裁中心:

​ 以后我们导入依赖默认是不需要写版本号的:

​ 注意:(没有在dependencies里面管理的依赖还是需要声明版本号的)

2、导入的依赖

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

spring-boot-starter-web它的里面还是引用了:

        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
          <version>2.5.5</version>
          <scope>compile</scope>
        </dependency>

spring-boot-starter-web

​ spring-boot-starter :springBoot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

​ SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器) ,只需要在项目里面引入这些starters相关场景的所有依赖都会导入进来。要用什么就导入什么场景的启动器。

3、底层注解

1、如何给容器里面添加组件

1.1@Configuration

​ 告诉SpringBoot这是一个 配置类 == 配置文件

但是配置类本身也是组件

注意:但是在配置类,我们不能写标签了,要写方法

@Configuration   将类标记为适合 Spring 驱动的配置类似于我们的bean文件
public class MyClass {  
    
	//@Bean给容器中添加组件,以方法名作为主键的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例
    @Bean
    public Pet pet(){
        return new Pet();
    }
    
    @Bean("tow")   //指定id名  
    public Pet pet01(){
        return new Pet("张三",50);
    }
    
}
  • @Bean相当于是我们以前的Spring配置文件一样注册使用

          <bean id="pet" class="com.yang.controller.Pet">
              <property name="name" value=""></property>
              <property name="age" value=""></property>
          </bean>
    

    操作容器组件

    //接收所有组件的容器
    ConfigurableApplicationContext run1 = SpringApplication.run(HelloWorldApplication.class, args);
    
    //通过这个容器获取bean组件,和spring的xml文件操作一样
    run1.getBean("pet01");
    
  • 配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的

            Pet pet1 = (Pet) run.getBean("pet01");
            Pet pet2 = (Pet) run.getBean("pet01");
            System.out.println(pet1 == pet2);
            System.out.println(pet1.hashCode());
            System.out.println(pet2.hashCode());
    
    结果:	true
    	  1301987508
    	  1301987508
    

    不生成代理对象

    @Configuration(proxyBeanMethods = false) 
    
1.2 @Import({})

给容器中自动创建出这个类型的组件,默认组件的名称就是全类名

@Import(User.class) 1标记


		//获取所有Pet类型的bean
        String[] beanNamesForType = run.getBeanNamesForType(Pet.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }

        User bean = run.getBean(User.class); 1标记
        System.out.println(bean);

结果:pet01
	 namePet02
	com.yang.controller.User@517566b

2、注解-条件装配

1、@Conditional

​ 条件装配:满足Conditional指定的条件,则进行组件注入

3、注解-原生配置文件引入

@ImportResource
 @ImportResource("classpath:beans.xml")

4、配置绑定

1、@ConfigurationProperties

方式一:@Component + @ConfigurationProperties

@Component   //只有在容器中的组件,才会拥有SpringBoot提供的强大功能
@ConfigurationProperties(prefix = "mycar")
public class Car {
    
}

方式二:@Component + @EnableConfigurationProperties

// 1.开启Car 配置绑定功能
// 2.把这个Car这个组件自动注入到容器中
@EnableConfigurationProperties(Car.class)

2、主程序类,主入口类

@SpringBootApplication       //标注这是一个主程序,说明这是一个springboot应用
public class HelloWorldApplication {

    public static void main(String[] args) {
        //Spring应用启动起来
        SpringApplication.run(HelloWorldApplication.class,args);
    }

}

@SpringBootApplication : springboot应用,标注在某个类上,说明这个类就是Springboot主配置类,

那springboot就应该运行这个类的main方法来启动Springboot应用;

@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}
)}
)

@SpringBootConfiguration:Springboot的配置类

​ 标注在某个类上,表示这是一个SpringBoot的配置类

​ @Configuration: 配置类上来标注这个注解;

​ 配置类 — 配置文件 ;配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration: 开启自动配置功能

​ 以前我们需要配置的东西,SpringBoot帮我们自动装配;@EnableAutoConfiguration告诉Springboot开启自动装配功能,这样自动配置才能生效;

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自动配置包

​ @Import({Registrar.class})

​ Spring的底层注解@Import,给容器中导入一个组件;导入的组件由Registrar.class来导入

@Import({AutoConfigurationImportSelector.class}):给容器中导入组件

​ AutoConfigurationImportSelector

​ 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;

自动配置原理

//标注这是一个主程序,说明这是一个springboot应用

@SpringBootApplication

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

1、@SpringBootConfiguration

@Configuration。代表当前是个配置类

2、@ComponentScan

指定来定义要扫描的特定包,如果没有定义特定的包,将从声明该注解的类的包开始扫描。

3、@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

1、@AutoConfigurationPackage

自动配置包?,指定了默认的包规则

@Import(AutoConfigurationPackages.Registrar.class)   //给容器中导入一个组件
public @interface AutoConfigurationPackage {}

//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来。HelloWorldApplication所在的包下。

2、@Import(AutoConfigurationImportSelector.class)

最终就是到这个文件,给容器中加载所有的配置类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XErD1cf-1635054821090)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1635048457660.png)]

ava
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}


**1、@AutoConfigurationPackage**

自动配置包?,指定了默认的包规则

```java
@Import(AutoConfigurationPackages.Registrar.class)   //给容器中导入一个组件
public @interface AutoConfigurationPackage {}

//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来。HelloWorldApplication所在的包下。

2、@Import(AutoConfigurationImportSelector.class)

最终就是到这个文件,给容器中加载所有的配置类

[外链图片转存中…(img-0XErD1cf-1635054821090)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isvMDoco-1635054821091)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1635048467594.png)]

上一篇:Java第一课!用cmd运行Java代码


下一篇:Mardown学习