学记:为spring boot写一个自动配置

  spring boot遵循“约定由于配置”的原则,使用annotation对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来。spring boot的神奇不是借助代码的生成来实现的,而是通过条件注解来实现的。

  自动配置AutoConfiguration是实现spring boot的重要原理,理解AutoConfiguration的运行原理特别重要,自己写一个AutoConfiguration可以加深我们对spring boot的理解。

1、定义Type-safe Configuration Properties

@ConfigurationProperties("author")//1
public class AuthorPropertis {
    private static final String NAME = "pyj";

    private static final String PWD = "12324";

    private String name = NAME;//2

    private String pwd = PWD;

    private String[] arrayProps;//3

    private Properties properties = new Properties();//4

    private List<Map<String, Object>> listProp1 = new ArrayList();//5

    private List<String> listProp2 = new ArrayList();//6

    private Map<String, Object> mapProps = new HashMap();//7 

    getter and setter...
}

1、@ConfigurationProperties映射application.yml以author为前缀的配置

2、author.name的默认值是pyj

3-7:对于容器对象的属性注入

2、定义一个简单的bean

public class HelloService {

    private String msg;
  getter and setter...
 }

注意:不用纠结HelloService的内容,它就是一个简单的bean。

3、定义AutoConfiguration

@Configuration//1
@ConditionalOnClass(HelloService.class)//2
@EnableConfigurationProperties(AuthorPropertis.class)//3
@ConditionalOnProperty(prefix = "author",value = "enabled",matchIfMissing = true)//4
public class AuthorAutoConfiguration {

    private final AuthorPropertis authorPropertis;

    public AuthorAutoConfiguration(AuthorPropertis authorPropertis) {//5
        this.authorPropertis = authorPropertis;
    }

    @Bean//6
    @ConditionalOnMissingBean(HelloService.class)//7
    public HelloService helloService() throws JsonProcessingException {
        HelloService helloService = new HelloService();
        helloService.setMsg(authorPropertis.getName() +" :" + authorPropertis.getPwd());

        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("arrayProps: " + objectMapper.writeValueAsString(authorPropertis.getArrayProps()));
        System.out.println("listProp1: " + objectMapper.writeValueAsString(authorPropertis.getListProp1()));
        System.out.println("listProp2: " + objectMapper.writeValueAsString(authorPropertis.getListProp2()));
        System.out.println("mapProps: " + objectMapper.writeValueAsString(authorPropertis.getMapProps()));
        System.out.println("Props: " + objectMapper.writeValueAsString(authorPropertis.getProperties()));
        return helloService;
    }
}

1、@Configuration声明为一个配置类

2、@ConditionalOnClass表示HelloService在类路径下的时候调用

3、@EnableConfigurationProperties使用AuthorPropertis的配置

4、@ConditionalOnProperty指定的author是否有默认值

5、注入AuthorPropertis

6-7、当不存在HelloService的bean时候,新建一个HelloService的bean

4、在spring.factories注册

org.springframework.boot.autoconfigure.EnableAutoConfiguration=  com.github.gin.springboot.config.AuthorAutoConfiguration

  在resources新建META-INF目录,再新建spring.factories,注册上AuthorAutoConfiguration,让spring boot知道为你自动配置。

  如果不明白这个的原理,可以看看@EnableAutoConfiguration通过@Import({EnableAutoConfigurationImportSelector.class})来读取spring.factories

5、配置文件application.yml

debug: true

author:
  name: pyj
  pwd: 1234
  properties:
    reasonable: ‘true‘
    returnPageInfo: ‘true‘
  listProp1:
    - name: abc
      value: sgaw
    - name: efg
      value: sagsag
  listProp2:
    - config2Value1
    - config2Vavlue2
  mapProps:
    reasonable: true
    returnPageInfo: true
  arrayProps: 1,2,3,4,5

6、测试

@RestController
public class TestController {

    @Autowired
    HelloService helloService;

    @RequestMapping("/")
    public String index(){
        return "hello world!";
    }

    @RequestMapping("/hello")
    public String hello(){
        return helloService.getMsg();
    }
}

运行mvn spring-boot:run,如果看到结果,那么证明是没问题的

  上面的AuthorPropertis 、HelloService 、AuthorAutoConfiguration 可以作为一个独立的starter pom为其他项目提供一个通用的服务。虽然spring boot覆盖了大部分的使用场景,但也不是全部都有,例如mybatis就没有spring boot的自动配置,所以我们可以利用AutoConfiguration起到同样的效果。

  实例代码地址:有爱自取

时间: 2024-12-13 02:34:27

学记:为spring boot写一个自动配置的相关文章

安装使用Spring boot 写一个hello1

一.创建springboot 项目 二.进行代编写 1.连接数据库:application.properties里配置 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/huoguo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone

Spring Boot面试杀手锏————自动配置原理

转:https://blog.csdn.net/u014745069/article/details/83820511 引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架. 当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不

学记:spring boot使用官网推荐以外的其他数据源druid

虽然spring boot提供了4种数据源的配置,但是如果要使用其他的数据源怎么办?例如,有人就是喜欢druid可以监控的强大功能,有些人项目的需要使用c3p0,那么,我们就没办法了吗?我们就要编程式新建一个数据源了吗?不用了!spring boot 1.4.1.RELEASE为我们提供了简洁的方式使用自己想要的数据源. 网上也有其他数据源的配置方法,但是都是编程式新建一个数据源,太繁琐了.我在这里记录一下官网的做法: 1.Configure a DataSource 官网介绍:http://d

学记:spring boot整合shiro出现UnavailableSecurityManagerException

spring boot自带spring security,spring security自然不用说是一个强大的安全框架,但是用惯了shiro,一时半会用不来spring security,所以要在spring boot中自己整合shiro.说到整合shiro,网上也是有不少教程的,但是网上的教程也不是一定是对的,可能有版本等各种问题,所以说还是要自己来动手做一遍. 在我动手整合的时候出现UnavailableSecurityManagerException的错误: 2016-12-24 10:5

SpringBoot 源码解析 (五)----- Spring Boot的核心能力 - 自动配置源码解析

在上一篇博客中分析了springBoot启动流程,大体的轮廓只是冰山一角.今天就来看一下springBoot的亮点功能:自动化装配功能. 先从@SpringBootApplication开始.在启动流程章节中,我们讲述了SpringBoot2大致的启动步骤,并进行了源码详解.但是在刷新容器这块并未展开,refreshContext(context);简单的一行代码,背后却做了太多事情.所以为了不喧宾夺主,本篇也尽量选取和注解@SpringBootApplication有关的方法讲解. sprin

Spring Boot 2.0+ 自定义配置类扩展springMVC的功能

在spring boot1.0+,我们可以使用WebMvcConfigurerAdapter来扩展springMVC的功能,其中自定义的拦截器并不会拦截静态资源(js.css等). 在Spring Boot2.0版本中,WebMvcConfigurerAdapter这个类被弃用了. @Deprecated public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer { 那么我们如何来扩展关于MVC的配置呢?

spring cloud教程之使用spring boot创建一个应用

<7天学会spring cloud>第一天,熟悉spring boot,并使用spring boot创建一个应用. Spring Boot是Spring团队推出的新框架,它所使用的核心技术还是Spring框架,主要是Spring 4.x,所以如果熟悉spring 4的人,能够更快的接受和学会这个框架.Spring boot可以看做是在spring框架基础上再包了一层,这一层包含方便开发者进行配置管理和快速开发的模块,以及提供了一些开箱即用的工具,比如监控等. Spring Boot官方文档有中

spring chapter4 用SPRING BOOT创建一个项目

如何开发一个简单的“Hello World!”Web应用程序,该应用程序突出了Spring Boot的一些主要功能.我们使用Maven来构建这个项目,因为大多数IDE都支持它. 在开始之前,打开终端并运行以下命令以确保安装了有效的Java和Maven版本: 1:创建POM 我们需要从创建Maven pom.xml文件开始.打开喜欢的文本编辑器并添加以下内容: <?xml version="1.0" encoding="UTF-8"?> <proje

Spring Boot实现一个监听用户请求的拦截器

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } //这