APP下载
报价宝  ›  科技  › 

Java架构之Springboot_全域性配置、自动配置、条件注解

报价宝 来源:baojiabao.com 发布时间:2019-11-11 14:58:00 09月11日更新
报价宝综合消息Java架构之Springboot_全域性配置、自动配置、条件注解

1. 全域性配置档案

 SpringBoot专案使用一个全域性配置档案application.properties或者是application.yml来进行全域性配置。

配置位置:一般来讲,配置档案一般放在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: com.mysql.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: classpath:logbak.xml

#server:

# ssl:

# key-store: classpath:vc.dahancloud.com.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://x.x.x.x:3306/iot?useUnicode=true&characterEncoding=UTF-8

server:

port: 9097

alarmservice:

alarm: http://localhost:8093

说明:springboot的全域性配置档案除了以上这些还有很多,可以参考一下API文件。

2. starter pom

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

官方文件上提供的start pom有以下:

以上是列举一些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 Collection extends T>getSpringFactoriesInstance(Class type){

return getSpringFactoriesInstance(type, new Class>[]{});

}

//我们来看下getSpringFactoriesInstance这个方法源代码

private Collection extends T> getSpringFactoriesInstances(Class type,

Class>[] paramterTypes, Object... args){

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

//使用names确保唯一性,防止重复

Set names = new LinkedHashSet(

//类载入器

SpringFactoriesLoader.loadFactoryNames(type,classLoader));

List 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 loadFactoryNames(Class> factoryClass,

ClassLoader classLoder){

String factoryName = factoryClass.getName();

try{

Enumeration urls =(ClassLoader!=null ?

ClassLoader.getResource(FACTORIES_RESOURCE_LOCATION)) :

ClassLoader.getSystemResource(FACTORIES_RESOURCE_LOCATION);

List result = new ArrayList();

while(urls.hasMoreElements()){

URL url = urls.nextElement();

Properties properties = PropertiesLoaderUtils.loadProperties(

new UrlResource(url));

String factoryClassNames = properties.getProperty(factoryClassName);

result.addAll(Array.asList(

StringUtils.commaDelimitedListToStringArray(factoryClassNames)));

}

return result;

}catch(IOException ex){

throw new IllegalArgumentException("Unable to load ["

+ factoryClass.getName)+"] factories from location ["

+ FACTORIES_RESOURCE_LOCATION + "]",ex);

}

}

SpringBoo在进行SpringApplication物件例项化时会载入META-INF/spring.factories将其转变成物件,将该配置档案中的配置载入到Spring容器中。而这个配置档案里面配置了很多内容。

4. 条件注解

 我们在翻阅自动配置的过程中,可以回遇见很多条件注解,这边把常见的条件注解列举一下:

喜欢的话麻烦转发一下朋友圈,谢谢啦 ,如果有写的不好的地方也可以指出来,一起交流下!!!!

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 数码相机价格 笔记本价格 华为手机价格 降噪耳机价格