Springboot_全局配置、⾃动配置、条件注解
1. 全局配置⽂件
SpringBoot项⽬使⽤⼀个全局配置⽂件application.properties或者是l来进⾏全局配置。
配置位置:⼀般来讲,配置⽂件⼀般放在resource⽬录下或者类路径下的/config下。通常我们都是放在resource下。我们来看下@SpringBootApplication注解的源码
spring:
profiles:
# 使⽤那个配置
active: prod
datasource:
name: dataSource
username: XXX
password: XXX
# 使⽤druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: sql.jdbc.Driver
# filters: stat
# maxActive: 20
# initialSize: 1
# maxWait: 60000
# minIdle: 1
# timeBetweenEvictionRunsMillis: 60000
# minEvictableIdleTimeMillis: 300000
# validationQuery: select 'x'
# testWhileIdle: true
# testOnBorrow: false
# testOnReturn: false
# poolPreparedStatements: true
# maxOpenPreparedStatements: 20
# removeAbandoned: false
logging:
config: l
#server:
# ssl:
# key-store: classpath:vc.dahancloud.jks
# key-store-password: 4zc8zi119d2
---
# 开发环境配置
spring:
profiles: dev
datasource:
url: jdbc:mysql://localhost:3306/iot?useUnicode=true&characterEncoding=UTF-8
server:
port: 8080
---
# 测试环境配置
spring:
profiles: prod
datasource:
url: jdbc:mysql://:3306/iot?useUnicode=true&characterEncoding=UTF-8
server:
port: 9097
alarmservice:
alarm: localhost:8093
说明:springboot的全局配置⽂件除了以上这些还有很多,可以参考⼀下API⽂档。
2. starter pom
SpringBoot为我们提供了简化企业开发绝⼤多数场景的starter pom,只要使⽤了应⽤场景所需要的starter pom,相关的技术配置就会消除,就可以得到SpringBoot为我们提供的⾃动配置Bean。
官⽅⽂档上提供的start pom有以下:
名称描述
spring-boot-start SpringBoot核⼼start,包含⾃动配置、⽇志、yml配置⽂件的⽀持
spring-boot-start-actuator准⽣产特性,⽤来监控和管理应⽤
spring-boot-start-remote-shell提供基于SSH协议的监控和管理
spring-boot-starter-amqp使⽤spring-rabbit来⽀持AMQP
spring-boot-start-aop使⽤spring-aop和AspectJ⽀持⾯向切⾯编程
spring-boot-starter-batch对Spring Batch⽀持
spring-boot-starter-cloud-connectors对云平台(Cloud Foundy、Heroku)提供的服务提供简化的连接⽅式
spring-boot-starter-data-elasticsearch通过spring-data-elasticsearch对Elasticsearch⽀持
spring-boot-starter-data-gemfire通过spring-data-gemfire对分布式存储GemFile的⽀持
spring-boot-starter-data-jpa对JPA的⽀持,包含spring-data-jpa、spring-orm和Hibernate
spring-boot-starter-jdbc对JDBC数据库的⽀持
spring-boot-starter-mail对javax.mail的⽀持
spring-boot-starter-redis对键值对内存数据库Redis的⽀持,包含spring-redis
spring-boot-starter-security对spring-security的⽀持
spring-boot-starter-social-facebook通过spring-social-facebook对Facebook的⽀持
spring-boot-starter-web对web项⽬开发的⽀持,包含Tomcat和spring-webmvc
spring-boot-starter-Tomcat SpringBoot默认的Servlet容器Tomcat
spring-boot-starter-logging Sping Boot 默认的⽇志框架Logback
spring-boot-starter-log4j⽀持使⽤Log4J⽇志框架
spring-boot-starter-websocket对WebSocket开发的⽀持
spring-boot-starter-ws对Spring Web Services的⽀持
以上是列举⼀些starter pom ,还有⼀些并没有列举出来。如果需要可以⾃⼰去查阅⽂档。并且⼀些第三⽅技术都有⾃⼰推出的starter pom
3. ⾃动配置分析
我们可以通过maven的命令dependency:sources来下载该maven项⽬中的所有依赖包的源码。
我们在使⽤SpringBoot的时候会先⽣成⼀个SpringApplicaiton类,于是我们来分析⼀下这个类在⽣成中是如何进⾏⾃动配置
的:/font>
//SpringApplicaiotn类的初始化⽅法
@SuppressWarnings({"unchecked","rawtypes"})
private void initialize (Object[] sources){
if(sources!=null && sources.length>0){
this.sources.addAll(Arrays.asList(source));
}
this.webEnvironment = deduceWebEnvironment();
//注意这⼀步,这⼀步是进⾏⾃动配置
setInitializers((Collection)getSpringFactoriesInstances(
ApplictionContextInitializer.class));
setListeners((Collection)getSpringFactoriesInstances(
ApplicaitonListener.class));
this.mainApplicationClass = deduMainApplicationClass();
}
接着我们来看⼀下getSpringFactoriesInstance⽅法的源码
private <T> Collection<? extends T>getSpringFactoriesInstance(Class<T> type){
return getSpringFactoriesInstance(type, new Class<?>[]{});
}
//我们来看下getSpringFactoriesInstance这个⽅法源码
private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type, Class<?>[] paramterTypes, args){
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//使⽤names确保唯⼀性,防⽌重复
Set<String> names = new LinkedHashSet<String>(
//类加载器
SpringFactoriesLoader.loadFactoryNames(type,classLoader));
List<T> instances = createrSpringFactoriesInstances(type,parameterTypes,
classLoader,args,names);
AnnotationAwareOrderComparator.sort(instances);
return instances;
}
我们来看下通过loadFactoryNames⽅法加载的情况
//配置的路径
public static final String FACTORIES_RESOURCE_LOCATION =
"META-INF/spring.factories";
public static List<String> loadFactoryNames(Class<?> factoryClass,
ClassLoader classLoder){
String factoryName = Name();
try{
Enumeration<URL> urls =(ClassLoader!=null ?
List<String> result = new ArrayList<String>();
while(urls.hasMoreElements()){
URL url = Element();
Properties properties = PropertiesLoaderUtils.loadProperties(
new UrlResource(url));
String factoryClassNames = Property(factoryClassName);
result.addAll(Array.asList(
StringUtilsmaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}catch(IOException ex){
throw new IllegalArgumentException("Unable to load ["
+ Name)+"] factories from location ["
+ FACTORIES_RESOURCE_LOCATION + "]",ex);
}
}
SpringBoo在进⾏SpringApplication对象实例化时会加载META-INF/spring.factories将其转变成对象,将该配置⽂件中的配置载⼊到Spring容器中。⽽这个配置⽂件⾥⾯配置了很多内容。
4. 条件注解
我们在翻阅⾃动配置的过程中,可以回遇见很多条件注解,这边把常见的条件注解列举⼀下:
spring aop应用场景注解解释
@ConditionalOnClass({xxx.class})当存在xxx类的情况下,才会实例化该类
@ConditionalOnBean当容器⾥有指定的Bean的情况下
@ConditionalOnExpression基于SpEL表达式作为判断条件
@ConditionalOnJava基于JVM版本作为判断条件
@ConditionalOnJndi在JNDI存在的条件下查指定的位置
@ConditionalOnMissingBean当容器⾥没有指定Bean的情况下
@ConditionalOnMissingClass当容器⾥没有指定类的条件下
@ConditionalOnNotWebApplication当前项⽬不是web项⽬的情况下
@ConditionalOnProperty指定属性是否有指定的值
@ConditionalOnResource类路径是否有指定的值
@ConditionalOnSingleCandidate指定Bean在容器中只有⼀个,
或者虽然有多个但是指定⾸选的Bean
@ConditionalOnWebApplicaiton当前项⽬时Web项⽬的条件下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论