原 Spring boot核心技术(一)

Spring 核心功能
1. 独立运行的spring 项目

Spring Boot可以以jar的形式独立运行,运行一个Spring Boot项目只需要通过 java -jar xxx.jar命令来运行。

2. 内嵌servlet容器

Spring Boot可以选择内嵌Tomcat,Jetty或者Udertow,这样我们不需要以war的形式部署项目。

3. 提供starter简化maven配置 
Spring 提供一系列starter pom来简化maven的依赖加载。比如加入spring-boot-starter-web。

 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-web</artifactId>

  4. </dependency>

Spring Boot会自动加入Tomcat和Spring MVC的依赖。

4.自动配置Spring

Spring boot会根据在类路径中的jar,类。为jar包里的类自动配置bean,这样极大减少我们要是用的配置。当然并不是所有的场景都是这样,有时候还是需要去自定义配置的。

5.准生产的应用监控

Spring Boot提供了基于http,ssh,telnet对运行时的项目进行监控。

6,无代码生成和xml配置

Spring4.x提倡java配置和注解配置组合,二Spring Boot不需要任何xml即可实现spring配置。

7,Spring boot的优点 

è¿éåå¾çæè¿°

Spring 配置
1.基本配置

(1),入口类和@SpringBootApplication

SpringBoot通常有一个名为*Application.java的入口类,入口类里面有一个main方法,这个main方法其实就是一个标准的Java应用的main方法,也是启动SpringBoot的方法。

@SpringBootApplication是SpringBoot的核心注解,它是一个核心注解,源码如下: 
è¿éåå¾çæè¿°

其中@EnableAutoconfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。

例如添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和SpringMVC进行自动配置。

例如添加了spring-boot-starter-data-jpa依赖,SpringBoot会自动进行JPA相关的配置。 
SpringBoot会自动扫描@SpringBootApplication所在类的同级包以及下级包里的bean.

(2)关闭特定的自动配置

关闭特定的自动配置使用@SpringBootApplication注解的exclude参数,例如
 

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

3)定制Banner

1.1 修改banner 
(1)当我们启动SpringBoot时有一个默认图案。

è¿éåå¾çæè¿°

(2)我们在src/main/resources下新建一个banner.txt文件. 
(3)通过http://patorjk.com/software/taag/网站生成字符,如输入shabi,将生成的字符图案复制到banner.txt中. 
(4)重新运行SpringBoot项目,启动时图案就改变了。 
è¿éåå¾çæè¿°

1.2关闭Banner

main方法修改为:

 
  1. public static void main(String[] args) {

  2. //SpringApplication.run(DemoApplication.class, args);

  3. SpringApplication app = new SpringApplication(DemoApplication.class);

  4. app.setShowbanner(false);

  5. app.run(args);

  6. }

或者fluent API修改为

 
  1. new SpringApplicationBuilder(DemoApplication.class)

  2. .showBanner(false)

  3. .run(args);

高版本的Spring Boot没有app.setShowbanner(false);方法,我目使用1.5.9版本。可以在application.properties中配置:

spring.main.banner-mode=off

2,Spring Boot的配置文件

Spring Boot使用一个全局的配置文件application.properties或者application.yml放置在src/main/resources文件下或类路径的/config下。

Spring 不仅支持常规的.properties配置文件,还支持yaml的配置文件,yaml是以数据为中心的语言,在配置数据的时候具有面向对象特征。

Spring Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。

(1)简单示例

将tamcat默认的8080端口改为9090,并将默认的访问路径”/”修改为”/helloboot”; 
在application.properties加入:
 

 
  1. #不配置默认为8080端口

  2. server.port=9090

  3. #将默认的访问路径"/"修改为"/helloboot"

  4. server.contextPath=/helloboot

 

说明:contextPath,context-path通用,这里不介绍application.yml配置。

3.starter pom

SpringBoot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了场景需要的starter pom,SpringBoot会自动配置bean。

比如之前说的添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和SpringMVC进行自动配置。

pom.xml:

 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-web</artifactId>

  4. </dependency>

(3.1) 官方提供的starter pom 

è¿éåå¾çæè¿°

 

è¿éåå¾çæè¿°

 

è¿éåå¾çæè¿°

 

(3.2)第三方starter pom

è¿éåå¾çæè¿°

配置方式 
在pom.xml的project标签中加入:

<repositories>  

<repository>  
<id>唯一id</id>  
<name>名称</name>  
<url>url远程链接</url>  
</repository> 
<repository>

<id>lilyproject</id>  
<name>Lily Maven repository</name>  
<url>http://lilyproject.org/maven/maven2/deploy/</url>  
</repository> 

</repositories> 

(3.3)使用xml配置

SpringBoot提倡零配置,即无XML配置,但是在实际开发过程中,可能一些特殊的要求你必须使用xml配置,这时我们可以使用SpringBoot提供的@ImportResource来加载xml配置。 
例如:

@ImportResource({"classpath:some-content.xml","classpath:another-content.xml"})
1
4,外部配置文件

SpringBoot允许使用properties文件,yaml文件,和命令参数作为外部配置。

(4.1)命令行参数配置

SpringBoot是基于jar运行的,打成jar的程序可以通过 下面命令直接运行的。

java -jar XXX.jar
1
可以通过以下命令修改tomcat端口:

java -jar XXX.jar --server.port=9090
1
(4.2)常规属性配置

在常规的Spring环境下,注入properties文件里面的值的方式,通过@propertySource指明文件位置,然后通过@Value注入值。 
在SpringBoot项目中,我们只需要在application.properties定义属性,直接使用@Value注入。

实例

在以前的基础上在application.properties文件增加:

user.myname=bobo
user.age=18

@Value注入

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloComtroller {
       @Value("${user.myname}")
       private String name;
       @Value("${user.age}")
       private Integer age;

      @RequestMapping("/")
      public String helloword(){

       return "我叫"+name+",今年"+age+"岁!";

      }
}

运行结果:
è¿éåå¾çæè¿°


说明:这里如果定义user.name是获取系统的名称,后来改为myname。

(4.3)类安全的配置

以上使用@Value注入每个配置显得格外的麻烦,因为我们的配置通常有很多个,像那样每个配置就要注入多次。 
SpringBoot提供了基于类型安全的配置方式,通过@ConfiggurationProperties将properties属性和一个bean及其属性关联,从而实现类型安全的配置。 
基于以前的application.properties文件:

user.myname=bobo
user.age=18

当然我们也可以新建properties文件,通过@ConfiggurationProperties的属性locations指定properties的位置,且需要在入口类上配置。

类型安全的bean如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix="user")
public class UserSetting {
       private String myname;
       private Integer age;
    public String getMyname() {
        return myname;
    }
    public void setMyname(String myname) {
        this.myname = myname;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

代码解释: 
通过@ConfigurationProperties加载文件的配置,prefix属性指定配置时的前缀,locations指定配置文件路径,本例将配置放在application.properties文件中,不需要指定位置。

若新建了properties文件,则需要在指定位置。 
SpringBoot1.5之前可以通过@ConfigurationProperties的locations属性指定。

@ConfigurationProperties(prefix="user",locations="classpath:config/xxxxx.properties")

SpringBoot1.5之后使用:

@PropertySource("classpath:config/xxxxx.properties")
/*@PropertySource(value={""})*/

检查代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.entity.UserSetting;

@RestController
public class HelloComtroller {

    @Autowired
      private UserSetting userSetting;

      @RequestMapping("/")
      public String helloword(){

       return "我叫"+userSetting.getMyname()+",今年"+userSetting.getAge()+"岁!";

      }
}

代码解释: 
使用@Autowired可以直接注入该配置。

(4.4)日志配置

SpringBoot支持java Util Logging,Log4j,Log4j2和Logback作为日志框架。 
SpringBoot默认使用Logback作为日志框架。

配置日志级别:

#默认的Logback日志框架
logging.file=E:\\springBootWork\\mylog

配置日志文件,格式为logging.level.包名=级别

logging.level.org.springframework.web=DEBUG

(4.5)Profile配置

profile是Spring用来针对不同的环境对不同的配置提供支持,全局profile使用application-{profile}.properties,如application-prod.properties. 
通过在application.properties文件中设置spring.profils.active=prod来指定活动的profile。

实例:

下面做一个简单的演示,如我们分为生产环境和开发环境,生产环境下端口为8088,开发环境端口为8888. 
新建 
application-dev.properties文件中加入

server.port=8888

application-prod.properties文件中加入

server.port=8088

application.properties配置:

spring.profiles.active=prod

运行项目