1 springboot自动装配的意义
通过springboot的自动装配功能,我们只需要在项目中导入需要的依赖并配合少量代码和配置文件,就可以使用第三方的组件了,简化了项目开发。
2 springboot自动装配的使用
以redis为例,如果我们项目使用了redis组件,我们如何使自己的java服务访问redis呢,有以下三步。通过以下步骤,我们创建了RedisTemplate来完成对redis的增删改查等操作。
2.1 在项目中导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 在项目中创建RedisTemplate
@Configuration
public class RedisConfig {
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//可以自定义设置key\Value序列化
template.setValueSerializer();
template.setKeySerializer();
return template;
}
}
2.3 定义配置文件
spring:
redis:
cluster:
nodes: ip和port
password: '***'
timeout: 10000
lettuce: #如果使用的jedis 则将lettuce改成jedis即可
pool:
max-active: 8 #默认8个
max-wait: 8 #默认不限制
max-idle: 8 #默认8个
min-idle: 8 #默认 0
3 springboot自动装配的原理
springboot自动装配主要依靠注解来完成,下面以上文中的提到的RedisTemplate为例来讲解原理。
如上图所示,springboot程序启动时,@EnableAutoConfiguration注解生效,在AutoConfigurationImportSelector 类中代码会判断是否开启了自动装配,如下所示:
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 检查自动配置功能是否开启,默认开启,如果不开启,则返回空集合
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 封装将被引入的自动配置信息
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
// 返回符合条件的配置类的全限定类名数组
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
在getAutoConfigurationEntry中,读取了META-INF 目录下的 spring.factories 文件,如下图所示,可以看到RedisAutoConfiguration:
但不是所有的配置类我们都需要,需要根据条件判断是否需要装配,如下所示,RedisAutoConfiguration装配的条件是RedisOperations存在。
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.ConditionalOnClass=org.springframework.data.redis.core.RedisOperations
