springboot学习一
一、简单认识
1.1引入maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.guojava</groupId>
<artifactId>springbooy001</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<!-- <properties>-->
<!-- <mysql.version>5.1.43</mysql.version>-->
<!-- </properties>-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-batch</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- </dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2主程序
package cn.guojava.boot;
import cn.guojava.boot.Bean.Pig;
import cn.guojava.boot.Config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication//告诉spring这为一个主要类入口
public class Application {
public static void main(String[] args) {
//此用来返回ioc容器且启动springboot
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(Application.class,args);
}
1.3控制器
package cn.guojava.boot.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@ResponseBody//为写给浏览器的字符串
//@Controller
@RestController //等同于
public class WorldController {
@RequestMapping("/hello")
public String hello01(){
return "hello World";
}
}
1.4结果
1.5注意点
若其tomcat8080端口被占用则能够通过配置application.properties文件指定其运行端口
server.port=8880
1.6jar运行
简化配置引入插件直接把jar运行 打包成jar包再直接用jar运行springboot
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.7容器扫包的规则
springboot底层扫包规则是扫主配制类即@SpringBootApplication注解的配置类的所在包及其子包因此控制类要在其同级或者下级包
springboot底层扫包规则
1.8依赖管理和自动配置
查看内部自动配置好了哪些场景启动器
package cn.guojava.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication//告诉spring这为一个主要类入口
public class Application {
public static void main(String[] args) {
//此用来返回ioc容器
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(Application.class,args);
//查看ioc容器内部自动配置好了哪些场景启动器
String [] iocname = configurableApplicationContext.getBeanDefinitionNames();
for(String nameioc : iocname ){
System.out.println(nameioc);
}
}
}
结果:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
此配置把改springboot锁依赖的组件都将版本号作了配置 称之为自动版本仲裁机制
二、@Configuration注解作用及用法
package cn.guojava.boot.Config;
import cn.guojava.boot.Bean.Pig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//等同与配置xml告诉为spring配置类
public class MyConfig {
@Bean//给容器添加组件方法名作为组件id 返回的类型为组件类型 返回值就为在容器中保存的值
public Pig returnPig(){
return new Pig("peiKey");
}
}
运行
测试下是否其为单实例:
package cn.guojava.boot;
import cn.guojava.boot.Bean.Pig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication//告诉spring这为一个主要类入口
public class Application {
public static void main(String[] args) {
//此用来返回ioc容器
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(Application.class,args);
//查看ioc容器内部自动配置好了哪些场景启动器
String [] iocname = configurableApplicationContext.getBeanDefinitionNames();
for(String nameioc : iocname ){
System.out.println(nameioc);
}
Pig p1 = configurableApplicationContext.getBean("returnPig", Pig.class);
Pig p3 = configurableApplicationContext.getBean("returnPig", Pig.class);
System.out.println(p1==p3);
}
}
结果
当然主配置类本身也为组件看是否能够获取到它
MyConfig config = configurableApplicationContext.getBean(MyConfig.class);
System.out.println("配置类本身为"+config);
结果
则能够获取到
且注意
外部无论怎样调用容器配置类的函数多少次都为从容器中获取单实例
@Configuration(proxyBeanMethods = false)//告诉其不为一个代理对象 则其不会通过代理对象获取容器中的组件 多次调用就创建几次 Lite 因为在启动时不会再看容器里是否含有曾有过的组件则节省了时间
@Configuration(proxyBeanMethods = true) // Full告诉其为一个代理对象 单实例