本文档基于雷神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注入的组件:
- 输出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
}
- 组件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
条件注解,为注入组件设置一定的条件。
有众多的子注解:
![](/Users/Zelda/Desktop/notes/picture/截屏2021-04-27%2020.23.45.png)
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. 配置绑定
作用:将配置文件中的内容添加到代码中,方便日后代码内容的修改。
- 在SpringBoot配置文件application.properties添加:
mycar.brand=YD
mycar.price=10000
- 创建一个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
- 引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- idea的Plugin安装:搜索安装Lombok
- 注解使用:
- @Data相当于getter+setter+equals+hashCode+toString
- @NoArgsConstructor:无参构造器
- @AllArgsConstructor:全参构造器
- @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:项目初始化向导