springboot自动装配---实现一个自定义自动装配组件

Posted nijunyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot自动装配---实现一个自定义自动装配组件相关的知识,希望对你有一定的参考价值。

对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件

还是这张图

 

 技术图片

 

一、创建自己的自动配置工程, spring.factories文件中配置上自己的配置

技术图片

 

1.创建一个Properties类(UserDefProperties)用于接收配置文件配置的参数,类似于RabbitMQ/Mybatis等在yaml中配置的参数(对标该类org.springframework.boot.autoconfigure.amqp.RabbitProperties),

package com.nijunyang.autoconfig.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 *  * 自定义的配置类,映射配置文件参数
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@ConfigurationProperties(prefix = "spring.userdef.model")
public class UserDefProperties 
    private String userName;
    private Integer age;
    private Double height;

    public String getUserName() 
        return userName;
    

    public void setUserName(String userName) 
        this.userName = userName;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

    public Double getHeight() 
        return height;
    

    public void setHeight(Double height) 
        this.height = height;
    

 

2.创建一个XXXAutoConfiguration类(UserDefAutoConfiguration),实现我们的装配逻辑也就是从配置文件中获取数据并初始化我们需要的数据,比如RabbitMQ/Mybatis初始化各种连接工厂(org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.RabbitConnectionFactoryCreator#rabbitConnectionFactory),我们这儿就获取配置数据转换成一个对象用于测试效果,

package com.nijunyang.autoconfig.config;

import com.nijunyang.autoconfig.model.User;
import com.nijunyang.autoconfig.properties.UserDefProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

/**
 * 自定义启动类配置类
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@Slf4j
@EnableConfigurationProperties(value = UserDefProperties.class)
public class UserDefAutoConfiguration 

    @Autowired
    private UserDefProperties userDefProperties;

    @Bean
    public User user()
        log.info("自定义自动装配UserDefAutoConfiguration.....");
        User user = new User();
        user.setAge(userDefProperties.getAge());
        user.setUserName(userDefProperties.getUserName());
        user.setHeight(userDefProperties.getHeight());
        return user;
    

 

3. spring.factories文件中配置EnableAutoConfiguration数据指向我们自己的UserDefAutoConfiguration

 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.nijunyang.autoconfig.config.UserDefAutoConfiguration

 

二、创建自己的启动器(starter)

技术图片

 

1.启动器啥都不需要做,只需要引入自动配置工程依赖

 

<dependency>
            <groupId>com.nijunyang</groupId>
            <artifactId>autoconfig</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 

三、测试工程

技术图片

 

1. 引入启动器依赖

<dependency>
            <groupId>com.nijunyang</groupId>
            <artifactId>starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 

2. application.properties配置中加入自动配置工程中Properties类对应的值,类似我们在application.properties配置mybatis连接一样

spring.userdef.model.userName=zhangsan
spring.userdef.model.age=18
spring.userdef.model.height=1.70

 

3.测试接口类,自动注入我们用我们用于测试的建模

package com.nijunyang.autoconfigurationstartertest.controller;


import com.nijunyang.autoconfig.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@RestController
public class Controller 

    @Autowired
    User user;

    @GetMapping("/test")
    public User getUser()
    
        return user;
    

//    @GetMapping("/test")
//    public String getUser()
//    
//        return "123";
//    

 

4.启动工程查看日志,发现我们自定义的装配类日志会在启动日志输出,说明启动过程中去自动装配了自己的组件

 技术图片

5.测试接口访问,返回配置文件中的数据

技术图片

 

 

四、断点查看selectImports方法引入自定义启动和不引入对比,org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports

引入:

技术图片

 

不引入:

技术图片

 

至此就简单实现了一个自定义的自动装备组件...

 

以上是关于springboot自动装配---实现一个自定义自动装配组件的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

掌握了SpringBoot的自动装配原理后你会发现自定义Starter也是非常容易的哦!

掌握了SpringBoot的自动装配原理后你会发现自定义Starter也是非常容易的哦!

通过注解实现自定义Spring Boot Starter自动装配

SpringBoot自动装配原理及自定义start开发

SpringBoot自动装配原理及自定义start开发