SpringBoot(一)
一。
每个Spring Boot版本都提供了它支持的依赖项的列表,当你升级Spring Boot的版本时,依赖项也会以一致的方式升级,如果有需要,你仍然可以指定版本覆盖springboot的默认版本。当然除了定义依赖版本,spring-boot-starter-parent还提供了以下特性:
默认使用Java 8
使用UTF-8编码
一个依赖管理的功能,管理公共依赖的版本,在dependencies里的依赖可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承,这点就是上面所说的。
合理的资源过滤(Sensible resource filtering.)
识别插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(例如: application-dev.properties 和 application-dev.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
如果你需要从其他父pom继承或者你不喜欢这种方式,当然还有其他解决解决方案,如下:
<dependencyManagement>
<dependencies>
<dependency>
<!--从springboot导入依赖关系管理 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
以上两种方式都行,由实际情况取舍。
子工程的pom文件
<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>
<parent>
<groupId>com.eastcom</groupId>
<artifactId>SpringBoot_Demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SpringBoot_HelloWorld</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
只需导入spring-boot-starter-web,官网对它的描述是:使用Spring MVC构建Web(包括RESTful)应用程序的入门者,使用Tomcat作为默认嵌入式容器。
创建的是war包,导入的这个starter默认你开发的就是web应用程序并会相应的对Spring进行一些默认配置。比如描述里说的默认是使用Tomcat作为web容器,默认端口8080,当然这些你都可以修改。
编写测试代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class Application {
@RequestMapping(value="/hello",method=RequestMethod.GET)
public String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
就Application类中的几个注解简单解释一下:
@RestController和@RequestMapping是Spring MVC的注解。
@RestController和@Controller一样都是标注在Controller上的注解,上面hello方法返回的是String,如果这里用的是@Controller而不是@RestController,那么在hello方法还应该加一个注解@ResponseBody,使用@RestController表示该类中方法返回的String可以直接在浏览中输出。
@RequestMapping注释提供路由信息,也就是其中的value值,带/hello路径的请求会映射到hello方法,method指定请求为get请求。
@SpringBootApplication注解,该注解是一个复合注解,包括@ComponentScan、@SpringBootConfiguration、@EnableAutoConfiguration三个注解。该注解一般是放在主类上,也就应用程序的入口类上,@SpringBootApplication注解会去扫描被该注解标注的类所在包及其子包下被特定注解(比如说@Controller、@Repository、@Service、@Component、@Configuration等等)标注的类,并把它们纳入spring容器管理。
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
@EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置。
@ComponentScan就是扫描包了,上面说@SpringBootApplication注解会扫描包就是因为有这个注解了。
你也可以使用@ComponentScan注解和@EnableAutoConfiguration注解代替@SpringBootApplication注解,其效果是一样的。
启动项目
右键-->Run As-->Spring Boot App,在控制台就能看到相应启动信息了。
输出信息最上面的是banner图,这个也是可以改的,下面紧接着的是版本信息,然后就是项目启动的日志,可以看到红框中日志,Tomcat端口是8080。
二。
配置文件的位置
配置文件的位置也可以放到不同的位置,当然,不同的位置配置文件读取的优先级肯定也不同,下面是配置文件可以放置的四个位置,优先级依次从高到低:
file:./config/ 项目当前路径下的config子目录
file:./ 项目当前目录
classpath:/config/ 类路径下的config目录
classpath:/ 类路径下
在这四个位置新建四个配置文件,然后在项目中看一下这四个位置,图中数字跟上面数字对应。
然后在每一个配置文件中添加一个配置com.eastcom.index,值跟图中的数字对应,分别是1,2,3,4。另外我把每个配置文件中都加上了上面的三个自定义配置,并把版本号稍微改成跟顺序对应。如下:
在Application类添加代码,如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
MyConfiguration_Value myConfiguration_Value = context.getBean(MyConfiguration_Value.class);
System.out.println(myConfiguration_Value.toString());
MyConfiguration_Properties myConfiguration_Properties = context.getBean(MyConfiguration_Properties.class);
System.out.println(myConfiguration_Properties.toString());
System.out.println(context.getEnvironment().getProperty("com.eastcom.index"));
context.close();
}
}
三。使用 spring.profiles.active来分区配置
spring-boot-starter-parent提供的特性,其中就包括能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(例如: application-dev.properties 和 application-dev.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
新建三个配置文件,分别为application-dev.properties(开发)、application-test.properties(测试)、application-prod.properties(生产)。
可以使用spring.profile.active配置项在application.properties配置文件中指定哪些配置文件处于活动状态,可以指定多个。
新建一个配置类MyActiveProfileConfig等会要用,代码如下:
@Profile("dev")表示只有当启动的配置是开发环境的配置是才创建这个bean,@Profile也可以放在类上,意思是一样的,只有当启用某个配置文件是才去创建这个配置类中的bean。
为了跟上面说的分开,再重新创个主类AppActiveProfile吧,强迫症,全混一起感觉太乱了。代码如下:
@SpringBootApplication
public class AppActiveProfile {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(AppActiveProfile.class);
// application.setAdditionalProfiles("dev","prod");
ConfigurableApplicationContext context = application.run(args);
context.close();
}
}
运行看打印信息。设置启用的是dev和test,可以看到已经启用了,@Profile注解是生效了的。