Springboot基础

本文档基于雷神SpringBoot2课程整理而得,持续更新。

1. Springboot简介

spring是基于Java编写的一种框架,而SpringBoot是基于Spring的框架。

节约了配置文件的编写,适合企业级项目的开发和维护。

总结:SpringBoot牛逼。

2. HelloWorld

2.1 Maven配置

  <groupId>com.xz</groupId>
  <artifactId>ch01-helloWorld00</artifactId>
  <version>1.0-SNAPSHOT</version>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <mysql.version>8.0.11</mysql.version>
  </properties>

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

注意:

此时Springboot引入了父类的依赖,自己导入Maven。

1、见到很多 spring-boot-starter-* : *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
3、SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
5、所有场景启动器最底层的依赖

我们不需要注意导入依赖的版本号,SpringBoot会自动的导入。

如果需要引入特定版本的依赖:

  <properties>
    <mysql.version>8.0.11</mysql.version>
  </properties>

maven自动配置

  • 自动配好Tomcat

    • 引入Tomcat依赖。
    • 配置Tomcat
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.4.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  • 自动配好SpringMVC

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

    • SpringBoot帮我们配置好了所有web开发的常见场景

2.2 业务编写

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String handle01(){
        return "Hello, Spring Boot 2!";
    }
}

业务编写和之前的Springmvc一样,不过Class上的注解变成了@RestController,相当于@ResponseBody加上@Controller。返回值将会显示在浏览器内显示。

2.3 主程序创建

/**
 * 主程序类
 * @SpringBootApplication:这是一个SpringBoot应用
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

启动主程序,便会自动运行。

无需像SSM中那样,写配置文件,配置tomcat。。

注意:之后的包扫描都是在主程序类后面。

2.4 主程序配置

在resources文件夹下,可以创建application.properties文件,他可以配置主程序相关的配置信息。例如修改tomcat的端口号:

server.port=8888

3. @Configuration

3.1 bean

两个bean类的创建,用于之后的对象注入:

Pet:

public class Pet {
    private String name;
    get/set...
 }

User:

public class User {
    private String name;
    private Integer age;
    private Pet pet;
  	get/set...
}

3.2 @Configuration剖析

我们可以在主程序内查看ioc容器内的所有组件。

//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
    System.out.println(name);
}

同时能在MyConfig(自定义)类中,进行bean的实例化,并将实例化对象添加到容器中。

给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例。

获取的都是单实例对象。

@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类==配置文件
public class MyConfig {
    /**
     * 外部无论对配置类的这个组件注册方法调用多少次,获取的都是之前注册容器的单实例对象。
     * @return
     */
    @Bean//给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01() {
        User zhangsan = new User("张三", 18);
        //User组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }
  
    @Bean("tom00")//组件重命名
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }
}

添加组件后,可以在主程序中获取到ioc容器内的该组件:

//3、从容器中获取组件,
Pet tom01 = run.getBean("tom00", Pet.class);
Pet tom02 = run.getBean("tom00", Pet.class);
System.out.println("组件:"+(tom01==tom02));//true

注意:此时因为是单实例对象,所以tom01和tom02的地址值是相同的。


也可以将**MyConfig **类添加到IOC容器中。

其中run是返回的IOC容器,ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);//com.xz.boot.config.MyConfig$$EnhancerBySpringCGLIB$$9adde3df@4c9e9fb8

如果在MyConfig 类中@Configuration(proxyBeanMethods = true)代理对象调用方法。springBoot总会检查这个组件是否在容器中有。

如果@Configuration(proxyBeanMethods = false),则为false。

其中bean是上述MyConfig bean = run.getBean(MyConfig.class);获得的组件,调用user01方法。

//保持组件单实例
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user==user1);//true

User user01 = run.getBean("user01", User.class);
Pet tom00 = run.getBean("tom00", Pet.class);
System.out.println("用户的宠物:"+(user01.getPet()==tom00));

4. @Import

@Import也可以注入组件:在MyConfig类前面添加。

其中User是自定义类,DBHelper是第三方jar包提供的类。

@Import({User.class, DBHelper.class})
public class MyConfig {
	。。。。
	}

在主程序中可以获得Import注入的组件:

  1. 输出com.xz.boot.bean.User是Import注入的组件,user01是@bean注入的组件
String[] beanNamesForType = run.getBeanNamesForType(User.class);
for (String s : beanNamesForType) {
    System.out.println(s);//com.xz.boot.bean.User		user01
}
  1. 组件ch.qos.logback.core.db.DBHelper@6d868997是第三方jar包
DBHelper bean1 = run.getBean(DBHelper.class);
System.out.println(bean1);//ch.qos.logback.core.db.DBHelper@6d868997

5. @Conditional

条件注解,为注入组件设置一定的条件。

有众多的子注解:

5.1 @ConditionalOnBean

若在MyConfig类中将user01方法上的@Bean注释掉,使之不注入组件,则主程序中代码显示如下:

代码:

boolean tomcatPet = run.containsBean("tom00");
System.out.println("容器中tom组件:"+tomcatPet);
boolean user01 = run.containsBean("user01");
System.out.println("容器中user组件:"+user01);

输出:

容器中tom组件:true
容器中user组件:false

加上@ConditionalOnBean(name = “user01”)注释,

代表若容器中有user01组件,才注入tom00组件。

@ConditionalOnBean(name = "user01")
@Bean("tom00")//组件重命名
public Pet tomcatPet() {
    return new Pet("tomcat");
}

主程序输出:

容器中tom组件:false
容器中user组件:false

若将user01上的@Bean注释打开,输出为:

容器中tom组件:true
容器中user组件:true

5.2 @ConditionalOnMissingBean

@Conditional的注释也可以加在配置类的头上:

@Configuration(proxyBeanMethods = true)
@ConditionalOnMissingBean(name = "tom00")
public class MyConfig {
    @Bean
    public User user01() {
        User zhangsan = new User("张三", 18);
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }
    @ConditionalOnBean(name = "user01")
    @Bean("tom00")
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }
}

@ConditionalOnMissingBean(name = “tom00”):若IOC容器中中没有tom00组件,将会注入该类的组件。

主程序输出:

容器中tom组件:true
容器中user组件:true

若将@ConditionalOnMissingBean(name = “tom00”)改为:@ConditionalOnBean(name = “tom00”)

主程序输出:

容器中tom组件:false
容器中user组件:false

注意: 这里的@Conditional是有先后顺序的,会判断当前IOC容器中是否有设定的组件。而非先全部执行,在判断。

6. @ImportResource

配置文件beans.xml,需要将里面的组件注入到容器中

<bean id="haha" class="com.xz.boot.bean.User">
    <property name="name" value="zhangsan"></property>
    <property name="age" value="18"></property>
</bean>

<bean id="hehe" class="com.xz.boot.bean.Pet">
    <property name="name" value="tomcat"></property>
</bean>

在类上添加@ImportResource(“classpath:beans.xml”)即可注入。

7. 配置绑定

作用:将配置文件中的内容添加到代码中,方便日后代码内容的修改。

  1. 在SpringBoot配置文件application.properties添加:
mycar.brand=YD
mycar.price=10000
  1. 创建一个Car类:
public class Car {
    private String brand;
    private Integer price;
  	get/set...
    }

7.1 方法一

@Component:将Car组件添加到容器中。(也可以在配置类中用@Import代替,从而添加到容器)
@ConfigurationProperties(prefix = “mycar”):读取配置文件中以mycar开头的数据。

@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
  	get/set...
    }

7.2 方法二

在配置类前添加@EnableConfigurationProperties(Car.class),将@Component删去

@EnableConfigurationProperties(Car.class)作用:

1、开启Car的配置绑定功能

2、把Car这个组件自动注册到容器中

@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String brand;
    private Integer price;
  	get/set...
    }

7.3 显示结果

Controller文件中:

@RestController
public class HelloController {

    @Autowired
    Car car;

    @RequestMapping("/car")
    public Car car() {
        return car;
    }
}

结果在浏览器对应地址显示,即配置文件对应内容。

8. 开发小技巧

8.1 Lombok

  1. 引入依赖
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
  1. idea的Plugin安装:搜索安装Lombok
  2. 注解使用:
    1. @Data相当于getter+setter+equals+hashCode+toString
    2. @NoArgsConstructor:无参构造器
    3. @AllArgsConstructor:全参构造器
    4. @Slf4j:日志

8.2 Dev-tools

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

项目自动重启:快捷键fn+f9+command

8.3 Spring Initailizr

Spring Initailizr:项目初始化向导

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值