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

对于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

引入:

不引入:

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

原文地址:https://www.cnblogs.com/nijunyang/p/11191971.html

时间: 2024-10-08 15:54:42

springboot自动装配(2)---实现一个自定义自动装配组件的相关文章

Springboot 系列(三)Spring Boot 自动配置

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring Boot 官方网站已经提供了完整了配置示例和解释. 可以这么说,Spring Boot 的一大精髓就是自动配置,为开发省去了大量的配置时间,可以更快的融入业务逻辑的开发,那么自动配置是怎么实现的呢? 1. @SpringBootApplication 跟着 Spring Boot 的启动类的注解

Gradle实现自动打包,签名,自定义apk文件名

Gradle实现自动打包,签名,自定义apk文件名 什么是签名,签名有什么用 Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行时到手机上时,是AS会自动用默认的密钥和证书来进行签名:但是我们实际发布编译时,则不会自动签名,这个时候我们就需要进行手动签名了!为我们的APK签名有以下好处: 1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应

扩展一个字符自动长度自动检测的函数

/** * 扩展一个字符自动长度自动检测的函数 * @param {[type]} max [description] * @param {Function} callback [description] * @return {[type]} [description] */ jQuery.fn.maxLength = function(max, callback) { this.each(function(){ var type = this.tagName.toLowerCase(); va

如果DataGrid的checkbox出现点一个另外自动点另一个现象

如果DataGrid的checkbox出现点一个另外自动点另一个现象: 取消(EnableRowVirtualization)这个选项就可以正常了(关闭虚拟UI):

一个可以自动生成静态库,自动安装程序的Makefile

.PHONY:clean install CC=g++ CFLAGS=-Wall -g BIN=libecho.a INCLUDE=echo SRC=src OBJS=Socket.o Rio.o TcpConnection.o PollPoller.o InetAddress.o TcpServer.o Thread.o Condition.o ThreadPool.o Exception.o Timer.o TimerThread.o STARD=-std=c++0x -rdynamic $

c语言:模拟实现一个输入密码自动取款的程序

模拟实现一个输入密码自动取款的程序 程序: #include <stdio.h> #include <windows.h> #include <string.h> int main() { char *p = "123456"; char passwd[10]; int i = 0; for (i = 0; i < 3; i++) { printf("请输入密码(最多9位):"); scanf("%s",

每次打开新标签页,都会提示“无法访问此网站”。并自动跳转到一个地址

使用该版本的chrome后,每次打开新标签页,都会提示"无法访问此网站".并自动跳转到一个地址"http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/_/chrome/newtab-"说明问题是因为此处访问google使用的地址是http协议.解决方式如下:输入:chrome://net-intern

Individual Project &quot;写一个能自动生成小学四则运算题目的程序&quot;

一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等. 二.源码的github链接 https://github.com/gaino1/IndividualProject 三.所设计的模块测试用例.测试结果截图 四.问题及解决方案.心得体会 要想学好C语言,要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自

js input框输入1位数字后自动跳到下一个input框聚焦

// input框输入1位数字后自动跳到下一个input聚焦 function goNextInput(el){ var txts = document.querySelectorAll(el); for(var i = 0; i<txts.length;i++){ var t = txts[i]; t.index = i; t.setAttribute("readonly", true); t.onkeyup=function(){ this.value=this.value.