六、spring boot 核心

6.1 基本配置

6.1.1 入口类和@SpringBootApplication

Spring Boot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的Java应用的入口方法。在main方法中使用SpringApplication.run(Ch522Application.class,args),启动Spring Boot应用项目。

@SpringBootApplication是Spring Boot的核心注解,是一个组合注解。源码如下:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
public @interface SpringBootApplication { 
    Class<?>[] exclude() default {}; 
    String[] excludeName() default {}; 
} 

@SpringBootApplication注解主要组合了@Configuration、@EnableAutoConfiguration、@ComponentScan;若不使用@SpringBootApplication注解,则可以在入口类上直接使用@Configuration、@EnableAutoConfiguration、@ComponentScan。

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

6.1.2 关闭特定的自动配置

@SpringBootApplication的源码我们可以看出,关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数,例如:

@SpringBootApplication(exclude ={DataSourceAutoConfiguration.class}) 

6.1.3 定制Banner

1.修改Banner
(1)在Spring Boot启动的时候会有一个默认启动图案

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _    
( ( )\___ | '_ | '_| | '_ / _` |    
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

(2)我们在src/main/resources下新建一个banner.txt。
(3)通过 http://patorjk.com/software/taag 网站生成字符,如敲入的为“KK”,将网站生成的字符复制到banner.txt中。

2.关闭banner
(1)main里的内容修改为:

SpringApplication app = new SpringApplication(Ch522Application.class); 
app.setShowBanner(false); 
app.run(args); 

6.1.4 Spring Boot的配置文件

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

6.1.5 starter pom

Spring Boot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了应用场景所需要的starter pom,相关的技术配置将会消除,就可以得到Spring Boot为我们提供的自动配置的Bean。

例如:

名称 描述
spring-boot-starter spring boot核心starter,包含自动配置,日志,yaml配置文件的支持
spring-boot-starter-aop 使用spring-aop和AspectJ支持面向切面编程

6.1.6 使用xml配置

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

@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"}) 

6.2 外部配置

Spring Boot允许使用properties文件、yaml文件或者命令行参数作为外部配置。

6.2.1 命令行参数配置

Spring Boot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行:

java -jar xx.jar

可以通过命令修改Tomcat端口号

java -jar xx.jar --server.port=8090

6.2.2 常规配置

在Spring Boot里,我们只需在application.properties定义属性,直接使用@Value注入即可。

示例
(1)application.properties增加属性:

book.author=zzj
book.name=spring boot

(2)修改入口类

package com.wisely.ch5_2_2; 

@RestController 
@SpringBootApplication 
public class Ch522Application { 
    
     @Value("${book.author}") 
     private String bookAuthor; 
     @Value("${book.name}") 
     private String bookName; 
    
     @RequestMapping("/") 
        String index() { 
            return "book name is:"+bookName+" and book author is:" + bookAuthor; 
        } 
  
    public static void main(String[] args) { 
        SpringApplication.run(Ch522Application.class, args); 
    } 
} 

6.2.3 类型安全的配置(基于properties)

上例中使用@Value注入每个配置在实际项目中会显得格外麻烦,因为我们的配置通常会是许多个,若使用上例的方式则要使用@Value注入很多次。

Spring Boot还提供了基于类型安全的配置方式,通过@ConfigurationProperties将properties属性和一个Bean及其属性关联,从而实现类型安全的配置。

示例
(1)新建spring boot项目
(2)添加配置,application.properties

author.name=zzj
author.age=20

(3)类型安全的Bean,代码如下:

package com.wisely.ch6_2_3.config; 
  
import org.springframework.boot.context.properties.ConfigurationProperties; 
  
@Component 
@ConfigurationProperties(prefix = "author") //1 
public class AuthorSettings { 
    private String name; 
    private Long age; 
  
    public String getName() { 
        return name; 
    } 
  
    public void setName(String name) { 
        this.name = name; 
    } 
  
    public Long getAge() { 
        return age; 
    } 
  
    public void setAge(Long age) { 
        this.age = age; 
    } 
} 

①通过@ConfigurationProperties加载properties文件内的配置,通过prefix属性指定properties的配置的前缀,通过locations指定properties文件的位置,例如:
@ConfigurationProperties(prefix = "author",locations = {"classpath:config/author.properties"})

(4)检验代码

package com.wisely.ch6_2_3; 

@RestController 
@SpringBootApplication 
public class Ch623Application { 
    
    @Autowired 
    private AuthorSettings authorSettings; //1 
    @RequestMapping("/") 
    public String index(){ 
           return "author name is "+ authorSettings.getName()+" and author age is "+authorSettings.getAge(); 
    } 
    public static void main(String[] args) { 
        SpringApplication.run(Ch623Application.class, args); 
    } 
} 

6.3 日志配置

Spring Boot支持Java Util Logging、Log4J、Log4J2和Logback作为日志框架,无论使用哪种日志框架,Spring Boot已为当前使用日志框架的控制台输出及文件输出做好了配置。

logging.file=/logs/mylog   日志文件名
logging.level.org.springframework=DEBUG  日志级别

6.4 Profile 配置

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

6.5 Spring Boot运行原理

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-1.3.0.x.jar内。

6.5.1 运行原理

关于Spring Boot的运作原理,我们还是回归到@SpringBootApplication注解上来,这个注解是一个组合注解,它的核心功能是由@EnableAutoConfiguration注解提供的。

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
@Import({ EnableAutoConfigurationImportSelector.class, AutoConfigurationPackages.Registrar.class }) 
    public @interface EnableAutoConfiguration { 
        Class<?>[] exclude() default {}; 
        String[] excludeName() default {}; 
} 

这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包。

原文地址:https://www.cnblogs.com/phtjzzj/p/7591903.html