2.Spring Boot核心

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

2.1 基本配置
1.入口类和@SpringBootApplication
Spring boot通常有一个名为*Application的入口类,入口类里面有一个main方法,这个main方法其实就是一个标准的java应用的入口方法。在main方法中使用SpringApplication.run(StudydemoApplication.class, args),启动spring boot应用项目。
@SpringBootApplication是Spring boot的核心注解,它是一个组合注解,组合了@Configuration、@EnableAutoConfiguration、@ComponmentScan。其中@EnableAutoConfiguration是让spring boot根据类路径中的jar包依赖为当前项目进行自动配置。
例如,添加了spring-boot-starter-web依赖,会自动添加tomcat和springmvc的依赖,那么spring boot会对tomcat和springmvc进行自动配置。
又如,添加了spring-boot-starter-data-jpa依赖,spring boot会自动进行JPA相关的配置。
Spring boot会自动扫描@SpringBootApplication所在类的同级包以及下级包里面的bean。建议入口类放置的位置在groupid+arctifactid组合的包名下。
如:
20191102100787\_1.png

2.关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数
如:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}).

3.Spring Boot的配置文件
Spring boot使用一个全局的配置文件application.properties或application.yml,放置在src/main/resources目录或者类路径的/config下。
Spring boot的全局配置文件的作用是对一些默认配置的配置值进行修改,
比如修改tomcat默认的端口号8080修改为9090,并将默认的访问路径“/”修改为“/helloboot”。可以在application.properties里面添加如下图:

20191102100787\_2.png

4.Starter pom
Spring boot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了应用场景所需要的starter pom,相关的技术配置将会消除,就可以得到spring boot为我们提供的自己配置的Bean。可登陆官网查看,除了官方的starter pom外,还有第三方为spring boot所写的starter pom。

5.使用xml配置
Spring boot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过spring提供的@ImportResources来加载xml配置,例如:
@ImportResources(“classpath:a.xml”,“classpath:b.xml”)

2.2 外部配置
1.常规属性配置
在spring boot里,我们只需在application.properties定义属性,然后直接使用@Value注入即可。如下图:

20191102100787\_3.png

20191102100787\_4.png

2.类型安全的配置(基于properties)
Spring boot还提供了基于类型安全的配置方法,通过@ConfigurationProperties将properties属性和一个Bean及其属性关联,从而实现类型安全的配置。Application.properties的配置如下图:
20191102100787\_5.png
类型安全的bean,如下图:
20191102100787\_6.png

通过@ConfigurationProperties加载properties文件内的配置,通过prefix属性指定properties的配置的前缀,也可以通过locations指定properties文件的位置。

执行代码如下:
20191102100787\_7.png

效果如下图:
20191102100787\_8.png
2.3 日志配置
Spring boot支持Java Util Logging、Log4j、Log4j2和Logback作为日志框架,无论使用哪种日志框架,spring boot已为当前使用日志框架的控制台输出以及文件输出做好了配置。
默认情况下,spring boot使用logback作为日志框架。
配置日志文件:logging.file=D:/bootlog/log.log, 配置日志的级别,格式为logging.level.包名=级别:logging.level.com.springboot.studydemo=DEBUG

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

2.5 Spring Boot运行原理
Spring 4.x提供了基于条件来配置Bean的能力,其实spring boot神奇的实现也是基于这一原理。
Spring boot关于自动配置的源码在spring-boot-autoconfigure-xxx.jar内,可以通过下面三种方式查看当前项目中已启动和未启动的自动配置的报告。
(1).运行jar时增加–debug参数
Java -jar xx.jar –debug
(2).在application.properties中设置属性
Debug=true
(3).20191102100787\_9.png

在控制台输出,已启动的自动配置为:
20191102100787\_10.png
未启动的自动配置为:

20191102100787\_11.png

1.运作原理
关于spring boot的运作原理,还是回归到@SpringBootApplication注解上来,它是一个组合注解,它的核心功能是由@EnableAutoConfiguration注解提供的。源码如下:
20191102100787\_12.png
这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,而spring-boot-autoconfigure-xx.jar就有一个spring.factories文件。如下:
20191102100787\_13.png
2.核心注解
打开上面任意一个AutoConfiguration文件,一般都有下面的条件注解,在spring-boot-autoconfigure-xx.jar的org.springframwork.boot.autoconfigure.condition包下,条件注解如下:

@ConditionalOnBean: 当容器里有指定的bean的条件下
@ConditionalOnClass: 当类路径下有指定的类的条件下
@ConditionalOnExpression: 基于SpEL表达式作为判断条件
@ConditionalOnJava: 基于jvm版本作为判断条件
@ConditionalOnJndi: 在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean: 在容器里没有指定bean的情况下
@ConditionalOnMissingClass: 当类路径下没有指定的类的条件下
@ConditionalOnNotWebApplication: 当前项目不是Web项目的条件下
@ConditionalOnProperty: 指定的属性是否有指定的值
@ConditionalOnResources: 类路径是否有指定的值
@ConditionalOnSingleCandidate: 当指定Bean在容器里只有一个,或者虽然有多个但是指定首选的bean
@ConditionalOnWebApplication:当前项目是web项目的条件下

这些注解都组合了@Conditional元注解,只是使用了不同的条件。

3.自定义starter pom
我们自定义一个starter pom,这意味着我们不仅有自动配置的功能,而且具有更通用的耦合度更低的配置。
下面建一个例子:当包中存在某个类的时候,自动配置这个类的Bean,并可在application.properties中配置Bean的属性值。

(1).新建一个maven项目,目录结构如下:
20191102100787\_14.png
(2).pom引入以下依赖:
20191102100787\_15.png
(3).新建属性配置的类:
20191102100787\_16.png
(4).新建判断依据类

20191102100787\_17.png
本例子是根据此类的存在与否来创建这个类的Bean

(5).新建自动配置类:
20191102100787\_18.png
代码说明

  1. @Configuration:使用该注解来说明该类是配置类,等价于xml中的beans
  2. @EnableConfigurationProperties(HelloServiceProperties.class):开启属性注入,对注解配置Bean的支持
  3. @ConditionalOnClass(HelloService.class):条件注解,当类路径下有指定的类的条件下。
  4. @ConditionalOnProperty(prefix=”hello”,value=”enabled”,matchIfMissing=true):条件注解,指定的属性是否有指定的值。当设置hello=enabled,如果没有设置则默认为true,即为条件符合。假如我们将matchIfMissing设置为false,则当设置hello=enabled时,条件为false,则不会将该Bean加载进容器类,当使用@Autowired注入HelloService时会报错。
    TODO:我项目中即使配了@ConditionalOnProperty(prefix=”hello”,value=”enabled”,matchIfMissing=true),也会报错,没找到原因,求大神赐教,所以贴图上没有此注解。
    5.@Bean:使用Java配置的方式来配置这个类,等价于xml中的bean。
    6.@ConditionalOnMissingBean(HelloService.class):容器中没有这个Bean时,新建这个Bean。
    (6).注册配置
    若想自动配置生效,需要注册自动配置类。在src/main/resources下新建META-INF/spring.factories,结构如下:
    20191102100787\_19.png
    在spring.factories中注册:
    20191102100787\_20.png
    如有多个自动配置,则用”,”隔开,此处的”\”是为了换行后仍然能读到属性。

最后执行mvn -install 把jar安装到本地仓库。

下面在之前的项目中引入依赖:
20191102100787\_21.png

简单的运行类代码如下:
20191102100787\_22.png

在代码中可以直接注入HelloService的Bean,但是在项目中我们并没有配置这个Bean,这是通过自动配置完成的。

运行结果:

20191102100787\_23.png
这是在application.properties中设置hello.msg= dota
再次运行:
20191102100787\_24.png

新增的自动配置显示在控制台的报告中,如下图:
20191102100787\_25.png


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 2.Spring Boot核心

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏