<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
</parent>
<dependencies>
<!--web场景的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
主程序固定写法:
//这是一个springboot应用
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handler01(){
return "Hello,Spring Boot 2!";
}
}
测试直接运行main方法即可
简化配置:
写在application.properties里即可
简化部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
自动配好springmvc
自动配好web常见功能
默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
无需以前的包扫描配置
想要改变扫描路径:@SpringBootApplication(scabBasePackage=“com.yutou”)
或者@ComponentionScan 指定扫描路径
各种配置有默认值
默认配置最终都是映射到MultipartProperties
配置文件的值最终都会绑定每个类上,这个类会在容器中创建对象
按需加载所有加载项
引入了哪些场景这个场景的自动配置才会开启
SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里
容器功能
容器:在JAVA当中,如果有一个类专门用来存放其他类的对象,这个类就叫做容器,或者就叫做集合。
容器与数组的区别与联系:
1.容器不是数组,不能通过下标的方式访问容器中的元素
2.数组的所有功能能通过ArrayList容器都可以实现,只是实现的方式不同
3.如果非要将容器当作一个数组来使用,通过Array方法返回的就是一个数组
底层注解-@Configuration注解
/**
* 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 2、配置类本身也是组件
* 3、proxyBeanMethods:代理bean的方法
* Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认)
* Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)
*/
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
测试代码:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3、从容器中获取组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
System.out.println("组件:"+(tom01 == tom02));
//4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
//保持组件单实例
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user == user1);
User user01 = run.getBean("user01", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("用户的宠物:"+(user01.getPet() == tom));
}
}
@Import({数组,比如:User.class,DBHelper.class})给容器中自动创建出这两个类型的组件,默认组件的名字就是全类名
@Conditional 条件装配
满足Conditional指定的条件,则进行组件注入
@ImportResource导入Spring配置文件
使用方法:
@ImportResource("classpath:beans.xml")
public class MyConfig {
...
}
@ConfigurationProperties配置绑定
@ConfigurationProperties + @Component
只有在容器中的组件,才会拥有SpringBoot提供的功能
@ConfigurationProperties(prefix = “mycar”)
在application.properties文件中 前缀为mycar才会绑定
引用第三方包(不能加@Component)时,使用:
@EnableConfigurationProperties + @ConfigurationProperties
@EnableConfigurationProperties(Car.class)
public class MyConfig {
...
}
开启Car配置绑定功能并且把这个Car组件自动注册到容器中
添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
并安装lombok插件:
Pet.java中
@ToString //生成Tostring
@Data //生成getter setter方法
@NoArgsConstructor //无参构造器
@AllArgsConstructor //全参构造器
public class Pet {
private String name;
}
User.java中
@NoArgsConstructor
//@AllArgsConstructor 不使用全参构造器 pet重复了
@Data
public class User {
private String name;
private Integer age;
private Pet pet;
//自己构造方法
public User(String name,Integer age){
this.name = name;
this.age = age;
}
}
@Slf4j //日志
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(@RequestParam("name") String name){
log.info("请求进来了...."); //在日志中显示
return "Hello, Spring Boot 2!"+"你好:"+name;
}
}
dev-tools 改变代码后不需要再重启运行
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在IDEA中,项目或者页面修改以后:Ctrl+F9
Spring Initailizr 自动导入依赖和结构
yaml的用法:
yaml是"YAML Ain’t Markup Lanuage"(YAML不是一种标记语言)的递归缩写,在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
非常适合用来做以数据为中心的配置文件
基本语法
数据类型:
字面量:单个的、不可再分的值。date、boolean、string、number、Null
k: v
对象:键值对的集合。Map、hash、set、object
#行内写法:
k: {k1:v1,k2:v2,k3:v3}
#或
k:
k1: v1
k2: v2
k3: v3
数组:一组按次序排列的值。array、list、queue
#行内写法:
k: [v1,v2,v3]
#或者
k:
- v1
- v2
- v3
使用Yaml表示:
person:
userName: zhangsan
boss: false
birth: 2019/12/12 20:12:33
age: 18
pet:
name: tomcat
weight: 23.4
interests: [篮球,游泳]
animal:
- jerry
- mario
score:
english:
first: 30
second: 40
third: 50
math: [131,140,148]
chinese: {first: 128,second: 136}
salarys: [3999,4999.98,5999.99]
allPets:
sick:
- {name: tom}
- {name: jerry,weight: 47}
health: [{name: mario,weight: 47}]
自定义类绑定的配置提示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 下面插件作用是工程打包时,不将spring-boot-configuration-processor打进包内,让其只在编码的时候有用 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
web开发:
静态资源目录:
只要静态目录资源放在类路径下,/static /public /resources /META-INF下的/resources
访问:当前项目根路径/ + 静态资源名
原理:静态资源/**
请求进来,先去找Controller看能不能处理,不能处理的所有请求又都交给静态资源处理器。
静态资源访问前缀:
默认是无前缀的
在application.yaml中写入
spring:
mvc:
static-path-pattern: /res/**
当前项目:static-path-pattern + 静态资源名 = 静态资源文件夹下找
改变静态资源默认的文件夹位置
web:
resources:
static-locations: [classpath:/haha/]
webjar:
可用jar方式添加css,js等资源文件
添加jquery
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
访问地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依赖里面的包路径。
欢迎页支持:
静态资源路径下 index.html
spring:
mvc:
static-path-pattern: /res/**
resources:
static-locations: [classpath:/haha/]
自定义小图标
spring:
favicon.ico 放在静态资源目录下即可
# mvc:
# static-path-pattern: /res/** 这个会导致 Favicon 功能失效