[关闭]
@javazjm 2017-10-30T02:33:58.000000Z 字数 6021 阅读 2636

SpringBoot系列学习一:核心和基本配置

Springboot 核心


SpringBoot核心

基本配置

1.@SpringBootApplication

是Spring Boot的核心注解,是一个组合注解,主要组合了@Configuration、@EnableAutoConfiguration、@ComponentScan;不使用@SpringBootApplication的话,可以使用该三个注解的组合。

@Configuration :

相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

几个简单例子回顾下,XML跟config配置方式的区别:

1 表达形式层面:
xml方式:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
  5. default-lazy-init="true">
  6. <!--bean定义-->
  7. </beans>

而基于JavaConfig的配置方式是这样:

  1. @Configuration
  2. public class MockConfiguration{
  3. //bean定义
  4. }

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。

2 注册bean定义层面:
xml方式:

  1. <bean id="mockService" class="..MockServiceImpl">
  2. ...
  3. </bean>

而基于JavaConfig的配置方式是这样:

  1. @Configuration
  2. public class MockConfiguration{
  3. @Bean
  4. public MockService mockService(){
  5. return new MockServiceImpl();
  6. }
  7. }

任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

3 表达依赖注入关系层面:
xml方式:

  1. <bean id="mockService" class="..MockServiceImpl">
  2. <propery name ="dependencyService" ref="dependencyService" />
  3. </bean>
  4. <bean id="dependencyService" class="DependencyServiceImpl"></bean>

而基于JavaConfig的配置方式是这样:

  1. @Configuration
  2. public class MockConfiguration{
  3. @Bean
  4. public MockService mockService(){
  5. return new MockServiceImpl(dependencyService());
  6. }
  7. @Bean
  8. public DependencyService dependencyService(){
  9. return new DependencyServiceImpl();
  10. }
  11. }

如果一个bean的定义依赖其他bean,则直接调用对应的JavaConfig类中依赖bean的创建方法就可以了。

@ComponentScan :

表示将该类自动发现(扫描)并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

注:SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。

@EnableAutoConfiguration

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

参考:http://7xqch5.com1.z0.glb.clouddn.com/springboot3-1.png

自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置
  1. public abstract class SpringFactoriesLoader {
  2. //...
  3. public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
  4. ...
  5. }
  6. public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
  7. ....
  8. }
  9. }

自动配置流程:
从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

2.关闭特定的自动配置

关闭自带的数据源配置,采用自定义数据源,方式:@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)

3.使用xml配置

提倡零配置,也可通过@ImportResource来加载,方式:@ImportResource({“classpath:some-context.xml”})

外部配置

1.命令行参数

可以在项目启动的时候指定参数,方式:java -jar --server.port=9090  spring.profiles.active = test

2.常规属性配置

直接在application.properities中增加属性,在类中使用@Value注入即可。开发过程中,会有不同的配置文件,针对开发、测试、生产,可以参考下面代码,在项目启动的时候初始化配置文件。

application.propertie
application-dev.properties
application-prod.properties
application-test.properties

  1. 在application.properties中配置
    针对不同环境使用不同配置
    spring.profiles.active = test

    这样就只会引入application-test.properties的配置文件了。

  2. 新建初始化配置类

  1. @Component
  2. @Configuration
  3. @PropertySource({
  4. "classpath:zhxonlineinterfaceconfig/zhxonlineinterface-${spring.profiles.active}.properties",
  5. "classpath:mongoconfig/mongo-${spring.profiles.active}.properties",
  6. "classpath:smsconfig/sms-${spring.profiles.active}.properties",
  7. "classpath:zhxinterfaceconfig/interface-${spring.profiles.active}.properties"
  8. })
  9. public class InitPropertSource {}
  1. 在类中引入常量的方法
  1. //短信地址
  2. @Value("${smsUrl}")
  3. private String smsUrl;
  4. //有效时间
  5. @Value("${effectiveTime}")
  6. private int effectiveTime;

3.类型安全的配置

将application.properties中的常量配置作为bean的属性,根据业务设置不同的类型,并提供get和set方法,用@Component加入容器中,使用时通过@Autowired注入对应的类中即可。

日志配置

1.默认

默认情况,Spring Boot使用Logback作为日志框架。
配置日志文件:logging.file=D:/log/log.log
配置日志级别,格式为logging.level.包名=级别:logging.level.com.zhx=DEBUG

2.Log4j

也可以使用log4j,需要先排除掉默认的日志框架依赖

1. 依赖
引入spring-boot-starter时,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,所以我们在引入log4j之前,需要先排除该包的依赖,再引入log4j的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <!-- Log4j -->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-log4j</artifactId>
  15. </dependency>

2.配置log4j.properties
在引入了log4j依赖之后,只需要在src/main/resources目录下加入log4j.properties配置文件,就可以开始对应用的日志进行配置使用

Profile配置

见常规属性配置

参数配置

1. 读取优先顺序


$ java -jar target/xxx.jar --server.port=9090 --server.context-path=/test

$ java -jar target/xxx.jar -Dserver.port=9090 -Dserver.context-path=/test

2. 变量嵌套使用

project.base-dir=file:///D:/springbootsample/spring-boot-demo1 
spring.thymeleaf.prefix=${project.base-dir}/src/main/resources/templates/

3. 文件位置

可通过@PropertySource("classpath:config.properties") 来读入任意其他设置文件

4. 多环境配置

通过设置参数“spring.profiles.active”即可切换设置文件

application.properties 
application-develop.properties 
application-test.properties 
application-product.properties

5. 设置值的Key支持Relaxed binding

以下四种写法都是可以的:

person.firstName 标准骆驼式语法
person.first-name 横线 多用于.properties 或 .yml
person.first_name 下划线 多用于.properties 或 .yml
PERSON_FIRST_NAME 大写 多用于环境变量

6. 读取配置值

  1. @Component
  2. @ConfigurationProperties(prefix = "prefix")
  3. public class SampleProperty {
  4. private String stringProp1;
  5. private String stringProp2;
  6. private Integer intProp1;
  7. private List<String> listProp;
  8. private Map<String, String> mapProp;
  9. // ...
  10. }
  1. @Autowired
  2. private Environment env;
  3. String errorPath = env.getProperty("server.error.path");
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注