@javazjm
2017-10-30T10:33:58.000000Z
字数 6021
阅读 2785
Springboot
核心
是Spring Boot的核心注解,是一个组合注解,主要组合了@Configuration、@EnableAutoConfiguration、@ComponentScan;不使用@SpringBootApplication的话,可以使用该三个注解的组合。
@Configuration :
相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
几个简单例子回顾下,XML跟config配置方式的区别:
1 表达形式层面:
xml方式:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<!--bean定义-->
</beans>
而基于JavaConfig的配置方式是这样:
@Configuration
public class MockConfiguration{
//bean定义
}
任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
2 注册bean定义层面:
xml方式:
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
而基于JavaConfig的配置方式是这样:
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl();
}
}
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
3 表达依赖注入关系层面:
xml方式:
<bean id="mockService" class="..MockServiceImpl">
<propery name ="dependencyService" ref="dependencyService" />
</bean>
<bean id="dependencyService" class="DependencyServiceImpl"></bean>
而基于JavaConfig的配置方式是这样:
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl(dependencyService());
}
@Bean
public DependencyService dependencyService(){
return new DependencyServiceImpl();
}
}
如果一个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加载配置
public abstract class SpringFactoriesLoader {
//...
public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
...
}
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
....
}
}
自动配置流程:
从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
关闭自带的数据源配置,采用自定义数据源,方式:@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
提倡零配置,也可通过@ImportResource来加载,方式:@ImportResource({“classpath:some-context.xml”})
可以在项目启动的时候指定参数,方式:java -jar --server.port=9090 spring.profiles.active = test
直接在application.properities中增加属性,在类中使用@Value注入即可。开发过程中,会有不同的配置文件,针对开发、测试、生产,可以参考下面代码,在项目启动的时候初始化配置文件。
application.propertie
application-dev.properties
application-prod.properties
application-test.properties
在application.properties中配置
针对不同环境使用不同配置
spring.profiles.active = test
这样就只会引入application-test.properties的配置文件了。
新建初始化配置类
@Component
@Configuration
@PropertySource({
"classpath:zhxonlineinterfaceconfig/zhxonlineinterface-${spring.profiles.active}.properties",
"classpath:mongoconfig/mongo-${spring.profiles.active}.properties",
"classpath:smsconfig/sms-${spring.profiles.active}.properties",
"classpath:zhxinterfaceconfig/interface-${spring.profiles.active}.properties"
})
public class InitPropertSource {}
//短信地址
@Value("${smsUrl}")
private String smsUrl;
//有效时间
@Value("${effectiveTime}")
private int effectiveTime;
将application.properties中的常量配置作为bean的属性,根据业务设置不同的类型,并提供get和set方法,用@Component加入容器中,使用时通过@Autowired注入对应的类中即可。
默认情况,Spring Boot使用Logback作为日志框架。
配置日志文件:logging.file=D:/log/log.log
配置日志级别,格式为logging.level.包名=级别:logging.level.com.zhx=DEBUG
也可以使用log4j,需要先排除掉默认的日志框架依赖
1. 依赖
引入spring-boot-starter时,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,所以我们在引入log4j之前,需要先排除该包的依赖,再引入log4j的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
2.配置log4j.properties
在引入了log4j依赖之后,只需要在src/main/resources目录下加入log4j.properties配置文件,就可以开始对应用的日志进行配置使用
见常规属性配置
或
$ java -jar target/xxx.jar --server.port=9090 --server.context-path=/test
$ java -jar target/xxx.jar -Dserver.port=9090 -Dserver.context-path=/test
project.base-dir=file:///D:/springbootsample/spring-boot-demo1
spring.thymeleaf.prefix=${project.base-dir}/src/main/resources/templates/
可通过@PropertySource("classpath:config.properties") 来读入任意其他设置文件
通过设置参数“spring.profiles.active”即可切换设置文件
application.properties
application-develop.properties
application-test.properties
application-product.properties
以下四种写法都是可以的:
person.firstName 标准骆驼式语法
person.first-name 横线 多用于.properties 或 .yml
person.first_name 下划线 多用于.properties 或 .yml
PERSON_FIRST_NAME 大写 多用于环境变量
@Value()
@Value("${prefix.stringProp1}")
private String stringProp1;
@Value("${prefix.stringProp2}")
private String stringProp2;
@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "prefix")
public class SampleProperty {
private String stringProp1;
private String stringProp2;
private Integer intProp1;
private List<String> listProp;
private Map<String, String> mapProp;
// ...
}
@Autowired
private Environment env;
String errorPath = env.getProperty("server.error.path");