SpringBoot学习
1.将springboot应用程序打包成jar包
<!--可以将springboot应用程序打包成jar包,之后可以直接使用cmd(java -jar XXX.jar)编译jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.java文件不能直接放在src/main/java下面,会报错(类名下面有红线),原因如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F4Csb4Xd-1622267592570)(C:\Users\11329\AppData\Roaming\Typora\typora-user-images\image-20210310115323317.png)]
3.spring-boot-starter-web是官方场景启动器,web中包含tomcat和mvc
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4.@Configuration(proxyBeanMethods = false),@Bean注解
/** * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的 * 2、配置类本身也是组件 * 3、proxyBeanMethods:cglib代理bean的方法 * Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的,代理对象】 * Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】 * 组件依赖(bean依赖)必须使用Full模式默认(用户的宠物就是容器中的宠物)。其他默认是否Lite模式 */ @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") //自定义bean名称 public Pet tomcatPet(){ return new Pet("tomcat"); } } ################################@Configuration测试代码如下######################################## @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)); } }
5.@Import自动导入组件(名字默认是全类名)
@Import({User.class, DBHelper.class})
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
6.@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
7.@ImportResource(“classpath:beans.xml”)
导入老版本的xml配置文件在类上面添加 @ImportResource 这个注解
8.配置绑定 (bean - application.yaml等)
使用Java读取到application.properties文件中的内容,并且把它封装到JavaBean中,以供随时使用;
@Component //只有容器中的组件才有springboot的强大功能 @ConfigurationProperties(prefix = "mycar") //prefix就是application中的统一的前缀(不管类型) mycar.name=10 public class Car { }
9.@Autowired 从容器中读取bean,并注册到类中
10.自动配置类
@SpringBootApplication
@SpringBootConfiguration: @Configuration声明是个配置类
@ComponentScan:指定扫描哪些包
@EnableAutoConfiguration: @AutoConfigurationPackage + @Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage:
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
//在Registrar.class中 getPackageNames()获取main所在的包名,然后将所有组件转成数组,然后批量注入组件
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
@Import(AutoConfigurationImportSelector.class) 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
11、按需开启自动配置项
虽然我们130个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。
12.spring-boot-devtools 重启项目(ctrl + f9)
每次项目更新,重新编译即可。静态页面不用重新编译
13.编写yaml文件,自动提示
<!--编写yaml文件,自动提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.4.3</version>
</dependency>
14.静态资源位置
静态资源放在 resources下面的 /static
(or /public
or /resources
or /META-INF/resources
这些目录下都可以
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcaV9NWc-1622267592573)(C:\Users\11329\AppData\Roaming\Typora\typora-user-images\image-20210311100727622.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJUsz0A6-1622267592574)(C:\Users\11329\AppData\Roaming\Typora\typora-user-images\image-20210311100935797.png)]
15.配置欢迎页和网站图标
第一种:1.在静态资源目录下添加index.html, 但是不能添加静态资源访问路径了,否则欢迎页无法访问
第二种:2.写controller返回首页
图标:图片命名为favicon.ico,放在静态资源目录下即可,关闭浏览器,清空缓存多刷新。
16.idea中快捷键
F4: 查看类的结构图
17.映射规则,到底怎么样找到controller的
项目启动,会将请求与 5个handllerMappings去依次匹配(controller上的请求会和RequestMappingHandlerMapping里面的匹配。还有欢迎页handllerMapping,直接转发到index.html)。还可以自定义handlerMapping。
18.获取请求参数
@PathVariable、获取 路径变量 的值
@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String username,
@PathVariable Map<String,String> pv,
@RequestHeader("user-agent") String userAgent,
@RequestHeader Map<String,String> headers)
@RequestParam、获取请求参数的值 href="/car/1/owner/zhangsan?age=18&inters=bast&inters=game"
@RequestHeader、获取请求头
@RequestHeader("user-agent") String userAgent, @RequestHeader Map<String,String> headers
@ModelAttribute、获取请求域中的相应属性
@MatrixVariable、 矩阵变量(地址中使用分号;的,默认禁用) /abc;jsessionid=xxx(分号前面是是访问路径,分号后面是矩阵变量)
@CookieValue、 获取cookie值
get car(@CookieValue("_ga") String _ga, @CookieValue("_ga") Cookie cookie){
map.put("_ga",_ga);
System.out.println(cookie.getName()+"===>"+cookie.getValue());
return map;
}
@RequestBody 获取请求体[POST]
//获取表单内容 username=zhangsan&email=aaa
@PostMapping("/save")
public Map postMethod(@RequestBody String content){
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}
原理
参数解析器:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jy2bDbA-1622267592575)(C:\Users\11329\AppData\Roaming\Typora\typora-user-images\image-20210311160937971.png)]
返回值处理器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YtSQ3411-1622267592576)(C:\Users\11329\AppData\Roaming\Typora\typora-user-images\image-20210311161206652.png)]