SpringBoot开发实战之自动配置
SpringBoot是基于Spring框架的,由于Spring框架配置麻烦、繁琐等特点,SpringBoot应运而生。其中一个特点是自动配置,它能让应用程序在不配置过多细节的情况下自动地完成配置目标。接下来我们将介绍如何使用自动配置。
一、自动配置的原理
首先,我们需要了解以下内容。
- SpringBoot提供了自动配置类,他们能够根据外部依赖自动化地配置Spring应用程序的环境。
- 在SpringBoot中,可以使用
@EnableAutoConfiguration
注解开启自动配置功能。 - SpringBoot会根据
classpath
下面的jar包、类包以及定义类中的注解进行自动配置。
二、使用自动配置
对于许多Spring应用程序,在应用启动时需要通过给定的几个标旗或参数来指定一些配置。例如,要指定可用于连接数据库的数据库驱动程序类的名称,必须将以下语句添加到application.properties文件中(或在控制台上设置):
spring.datasource.driverClassName = com.mysql.jdbc.Driver
借助SpringBoot的自动配置,如果程序中存在可以处理此配置信息的bean(例如,在项目中添加了mysql-connector-java),则驱动程序将自动配置并启动应用程序。
对于想要使用SpringBoot的完全自动配置机制,可以按照以下步骤来进行:
- 定义要创建的bean
- 将bean放到自动配置中
- 使用自动配置
示例1
首先,我们来看一个例子。
需求:自动装配service并添加到Spring容器中,提供一个输出Hello World
的方法。
我们需要在classpath路径下创建自动配置类,命名为HelloServiceAutoConfiguration
,通过@Configuration
注解表明是一个配置类,通过@EnableConfigurationProperties
来将自定义的配置文件(HelloServiceProperties
)注入到自动装配类中。其次添加一个别名HelloServiceProperties
的配置文件类,通过@ConfigurationProperties
读取配置文件的内容,同时提供者一个让用户使用的Service类。
HelloServiceAutoConfiguration类代码如下:
@Configuration
@EnableConfigurationProperties(HelloServiceProperties.class) // 配置文件绑定类,使其可以被自动装配
public class HelloServiceAutoConfiguration {
private final HelloServiceProperties properties;
public HelloServiceAutoConfiguration(HelloServiceProperties properties) {
this.properties = properties;
}
@Bean // 将定义好的实例注入到IoC容器中
@ConditionalOnMissingBean(HelloService.class) // 当IoC容器没有这个Bean的时候才会创建这个Bean,当然你还可以通过@ConditionalOnClass、@ConditionalOnExpression来控制Bean的创建条件。
public HelloService helloService() {
HelloService helloService = new HelloService();
helloService.setMsg(properties.getMsg());
return helloService;
}
}
HelloServiceProperties类代码如下:
@ConfigurationProperties(prefix = "hello") // prefix对应配置文件中属性的前缀
public class HelloServiceProperties {
private String msg = "world"; // 设置默认值
// 生成getter和setter方法
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
然后在resources/META-INF/spring.factories
文件中加入自动配置类HelloServiceAutoConfiguration
:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.service.HelloServiceAutoConfiguration
接着提供一个HelloService
类,代码如下:
public class HelloService {
private String msg;
public String sayHello() {
return "Hello" + " " + msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
以上代码完成了一个自动配置的整个过程,现在我们可以直接使用自定义的HelloService
了:
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String hello() {
return helloService.sayHello();
}
}
最后我们在application.properties
中配置hello.msg=chenyue
,访问http://localhost:8080/hello
,将会输出Hello chenyue
。
示例2
其次,我们在SpringBoot中经常使用Redis缓存,现在我们利用Redis实现一个简单的简单缓存实例,并演示如何进行自动配置。
首先,pom.xml引入Redis的相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
其次,创建配置文件类RedisProperties:
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
private String host;
private int port;
private String password;
private int maxIdle;
private int minIdle;
private int maxTotal;
private int maxWaitMillis;
// getter and setter
}
然后通过Java Configuration的方式创建Redis缓存管理类RedisCacheManager
,代码如下:
@Configuration
@AutoConfigureBefore(CacheAutoConfiguration.class) // 自动装配类的自动装配顺序是根据类所在包名的字母排序来确定的,为了保证其在CacheAutoConfiguration类之前执行,需要加上此注解
@EnableConfigurationProperties(RedisProperties.class)
public class RedisCacheAutoConfiguration {
private final RedisProperties redisProperties;
public RedisCacheAutoConfiguration(RedisProperties redisProperties) {
this.redisProperties = redisProperties;
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisProperties.getHost(), redisProperties.getPort());
config.setPassword(redisProperties.getPassword());
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());
jedisPoolConfig.setMinIdle(redisProperties.getMinIdle());
jedisPoolConfig.setMaxTotal(redisProperties.getMaxTotal());
jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWaitMillis());
JedisConnectionFactory factory = new JedisConnectionFactory(config);
factory.setPoolConfig(jedisPoolConfig);
factory.afterPropertiesSet();
return factory;
}
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
cacheConfigurations.put("cache1", redisCacheConfiguration.entryTtl(Duration.ofSeconds(20L)).disableCachingNullValues());
cacheConfigurations.put("cache2", redisCacheConfiguration.entryTtl(Duration.ofMinutes(1L)).disableCachingNullValues());
RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(redisCacheConfiguration)
.withInitialCacheConfigurations(cacheConfigurations).build();
return redisCacheManager;
}
}
注意:在自动配置类中需要使用@AutoConfigureBefore
注解来指明其加载顺序,避免在加载顺序不正确时,出现加载过程中出现的问题,比如说Bean不存在等等。
以上代码实现了一个自动配置的缓存管理器,现在在使用SpringBoot的缓存注解时将会默认使用到RedisCacheManager。
三、总结
SpringBoot的自动配置机制让我们开发过程中的繁琐操作降至最低,方便了开发,现在我们能自定义自动配置类为业务提供方便,并在项目中使用这个自动装配服务。
同时,也让我们深入了解了SpringBoot自动装配模式的原理。使用条件注解和反射机制可以实现自动配置类的自动动态加载,与此关联的是详细的文档和源码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot开发实战之自动配置 - Python技术站