SpringBoot开发实战之自动配置

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的完全自动配置机制,可以按照以下步骤来进行:

  1. 定义要创建的bean
  2. 将bean放到自动配置中
  3. 使用自动配置

示例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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java函数式编程(五):闭包

    让我们来详细讲解“Java函数式编程(五):闭包”。 什么是闭包 闭包是指一个函数能够记住并访问其词法作用域中的变量,即使在函数被定义之后,该词法作用域中的变量已经不存在了。通俗的说,就是在内部函数中引用了外部函数的变量,这个内部函数就是闭包。 闭包的应用 闭包的应用有很多,比如可以用来模拟类(JavaScript),可以用来实现许多设计模式(比如命令模式、…

    Java 2023年5月26日
    00
  • SpringBoot详细介绍SPI机制示例

    SpringBoot详细介绍SPI机制示例 在SpringBoot中,我们可以使用SPI机制来扩展框架的功能。本文将详细讲解SpringBoot详细介绍SPI机制示例的完整攻略,并提供两个示例。 1. SPI机制 SPI全称为Service Provider Interface,是Java提供的一种服务发现机制。在SPI机制中,服务提供者提供一种服务接口,而…

    Java 2023年5月15日
    00
  • JAVA中SSM框架的搭建实现CRUD的方法

    JAVA中SSM框架的搭建实现CRUD操作可以分为以下几个步骤: 1. 搭建环境 首先,我们需要安装必要的软件和工具: JDK Maven Eclipse或IntelliJ IDEA Tomcat MySQL 并配置环境变量和路径。安装完成后,在Eclipse或IntelliJ IDEA中创建一个新的Maven项目。 2. 添加依赖 在pom.xml文件中,…

    Java 2023年6月15日
    00
  • java对指定目录下文件读写操作介绍

    Java 对指定目录的文件读写操作介绍 Java 中对于指定目录的文件读写操作可以通过 Java IO 包中的类实现,这里介绍如何使用 Java IO 对指定目录下的文件进行读写操作。 读取指定目录下的文件 可以通过 Java 文件类(File)中的方法获取指定目录下的文件列表,在遍历文件列表过程中,通过流的方式读取每个文件的内容。示例代码如下: impor…

    Java 2023年5月20日
    00
  • Kafka producer端开发代码实例

    下面是详细的Kafka producer端开发代码实例攻略: 1. 搭建开发环境 首先,需要搭建Kafka的开发环境。可以参考官方文档:http://kafka.apache.org/quickstart。 2. 引入Kafka的依赖库 在Maven项目中,需要引入以下依赖: <dependency> <groupId>org.apa…

    Java 2023年5月20日
    00
  • IntelliJ IDEA 2021.3 正式发布之支持远程开发、IDE故障排查等多项优化改进

    下面是详细讲解IntelliJ IDEA 2021.3 正式发布之支持远程开发、IDE故障排查等多项优化改进的完整攻略。 1. 远程开发支持 IntelliJ IDEA 2021.3 版本新增了远程开发支持,可以让开发者在本地使用 IntelliJ IDEA 集成开发环境开发远程的应用程序。该功能可以大大节省开发人员的时间和自由度,避免了传统远程登录进行开发…

    Java 2023年5月27日
    00
  • spring framework体系结构及模块jar依赖关系详解

    Spring Framework是一个开放源代码的轻量级应用程序框架。它是为了解决企业级应用程序开发的许多疑难问题而创建的。Spring框架采用了依赖注入和面向切面编程等技术,使得代码更加简洁,更加易于测试和维护。在Spring中,模块jar包的依赖关系非常重要,因为它们决定了应用程序的行为和性能。 Spring Framework体系结构及模块jar依赖关…

    Java 2023年5月19日
    00
  • MyEclipse代码提示设置包括html和jsp的代码

    MyEclipse是一款常用的Java开发工具,具有强大的代码提示和自动补全功能,对于提高编程效率十分有帮助。而要完整地设置代码提示,包括HTML和JSP的代码,也并不是一件困难的事情。下面我将为大家介绍详细的设置步骤,包括两个实际的示例。 设置HTML代码提示 在MyEclipse中,设置HTML代码提示需要按照以下步骤进行: 打开MyEclipse软件,…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部