@SpringBootApplication
默认的规则:@SpringBootApplication注解所在的类视为主类,放在主包之下,其他的放在主包的子包之下, Springboot都包含主启动类,不管是web应用还是非web应用,它都是通过主方法来启动Springboot项目的。@SpringBootApplication注解所在的类可以当做配置文件来使用,因为有@SpringBootConfiguration注解。
@SpringBootApplication是 Spring Boot 的核心注解,也是一个复合注解,主要是由@SpringBootConfiguration,@EnableAutoConfiguration , @ComponentScan 3 个注解联合在一起组成的。
1.@SpringBootConfiguration: @Configuration 注解,实现配置文件的功能。
2.@EnableAutoConfiguration:开启自动配置的功能,初始化一些bean对象,并注入到spring容器中。也可以关闭某个自动配置的选项 例如: java 如关闭数据源自动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
3.@ComponentScan :组件扫描器,扫描注解,根据注解的功能,创建java bean,给属性赋值等等。组件扫描器默认扫描的是@ComponentScan 注解所在的类,类所在的包和子包。
@Configuration:
使用@Configuration注解修饰的类可以当作配置文件来使用,用来配置spring容器,是配置spring容器的纯java方式,在这个javaConfig配置类中,我们可以通过定义方法结合@Bean注解来声明对象,就是在方法上面使用@Bean注解,把方法返回值对象注入到Spring容器中,如果@Bean注解不指定对象名称,默认这个方法名就是java对象在容器中的名字
@SpringBootApplication
public class Application{
public static void main(String[] args){
//第一个参数是主启动类的类名,第二个参数是你传给应用的参数args
SpringApplication.run(Application.class,args);
}
}
@Controller
public class BootController {
@RequestMapping("/hello")
@ResponseBody
public String doSome(){
return "欢迎使用SpringBoot";
}
}
http://localhost:8080/hello:
Spring Boot核心配置文件application.properties
Spring Boot 的核心配置文件,用于配置Spring Boot程序,名字必须以 application开始:
如果在一个程序里有两个配置文件,那是以哪一个为准呢?
.properties 文件(默认采用该文件),启动有优先级properties>yml>ymal
# 访问web应用服务的端口号:默认为8080
server.port=8081
#设置访问应用的上下文路径:
server.servlet.context-path=/myboot
http://localhost:8081/myboot/hello
多环境配置:
在实际开发的过程中,我们的项目会经历很多的阶段(开发->测试->上线),每个阶段的配置也会不同,例如:端口、上下文根、数据库等,那么这个时候为了方便在不同的环境之间切换,SpringBoot提供了多环境配置,具体步骤如下:
创建多个配置文件,名称规则: application-环境名称.properties(yml)
- 创建开发环境的配置文件: application-dev.properties( application-dev.yml )
- 创建测试环境使用的配置:application-test.properties
- 创建生产环境核心配置文件:application-product.properties
#application.yml 激活哪个配置文件:
spring:
profiles:
active: dev
#application-dev.yml 开发环境的配置文件:
server:
port: 8081
servlet:
context-path: /mydev
#application-product.yml 生产环境的配置文件:
server:
port: 8082
servlet:
context-path: /myproduct
#application-test.yml 测试环境的配置文件:
server:
port: 8083
servlet:
context-path: /mytest
@Controller
public class BootController {
@RequestMapping("/hello")
@ResponseBody
public String doSome(){
return "欢迎使用SpringBoot的多配置文件";
}
}
@Value注解读取属性配置文件:
@Value("$ {key}") , key来自application. properties(yml)
#application.yml 激活哪个配置文件:
spring:
profiles:
active: dev
server:
port: 8080
servlet:
context-path: /myboot
#自定义key=value
school:
name: 桂林电子科技大学
website: www.application.com
address: 广西壮族自治区
site: www.baidu.com
#application-dev.yml 开发环境的配置文件:
server:
port: 8081
servlet:
context-path: /mydev
@Controller
public class BootController {
@Value("${server.port}")
private Integer port;
@Value("${server.servlet.context-path}")
private String contextPath;
@Value("${school.name}")
private String schoolName;
@Value("${site}")
private String site;
@RequestMapping("/hello")
@ResponseBody
public String doSome(){
return "schoolName:"+schoolName+",site:"+site+",项目的访问地址:"+contextPath+",使用的端口号:"+port;
}
}
http://localhost:8081/mydev/hello :
如果你写在了你引用的这个配置文件中,application.yml配置文件里也有出现,那么这个site的值取决于你引用的那个配置文件:
#application-dev.yml 开发环境的配置文件:
server:
port: 8081
servlet:
context-path: /mydev
site: application-dev
#application.yml 激活哪个配置文件:
spring:
profiles:
active: dev
server:
port: 8080
servlet:
context-path: /myboot
#自定义key=value
school:
name: 桂林电子科技大学
website: www.application.com
address: 广西壮族自治区
site: www.baidu.com
#application-dev.yml 开发环境的配置文件:
server:
port: 8081
servlet:
context-path: /mydev
site: application-dev
如果你的配置文件中没有school.site的话也没事,他会把能够匹配得到属性的赋值,没有的话赋默认值:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {
private String name;
private String website;
private String address;
private String site;
}
@Controller
public class BootController {
@Value("${server.port}")
private Integer port;
@Value("${server.servlet.context-path}")
private String contextPath;
@Value("${school.name}")
private String schoolName;
@Value("${site}")
private String site;
@Resource
private SchoolInfo schoolInfo;
@RequestMapping("/hello")
@ResponseBody
public String doSome(){
return "schoolName:"+schoolName+",site:"+site+",项目的访问地址:"+contextPath+",使用的端口号:"+port;
}
@RequestMapping("/info")
@ResponseBody
public String doInfo(){
return "schoolInfo对象:"+schoolInfo;
}
}
http://localhost:8081/mydev/info :
如果你不写前缀:那么前缀默认为空:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties
public class SchoolInfo {
private String name;
private String website;
private String address;
private String site;
}
在Springboot中我们如何使用容器
public static configurableApplicationContext run(Class<?> primarySource,String... args)
{
return run(new class[]{primarySource},args);
}
ConfigurableApplicationContext :接口,是Applicationcontext的子接口
只需要在 main 方法中执行 SpringApplication.run()方法获取方法的返回值,返回值就是Spring 容器对象,再去调用getBean()获取Java对象就可以了
@SpringBootApplication
public class Application{
public static void main(String[] args){
//第一个参数是主启动类的类名,第二个参数是你传给应用的参数args
ConfigurableApplicationContext ac = SpringApplication.run(Application.class,args);
SchoolInfo schoolInfo = (SchoolInfo)ac.getBean("schoolInfo");
System.out.println(schoolInfo);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {
private String name;
private String website;
private String address;
@Value("www.site.com")
private String site;
}
#application.yml 激活哪个配置文件:
spring:
profiles:
active: dev
server:
port: 8080
servlet:
context-path: /myboot
#自定义key=value
school:
name: 桂林电子科技大学
website: www.application.com
address: 广西壮族自治区
site: www.baidu.com