对于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自动装配(2)---实现一个自定义自动装配组件的更多相关文章

  1. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  2. Springboot 系列(三)Spring Boot 自动配置原理

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...

  3. spring学习总结——装配Bean学习一(自动装配)

    一.Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当描 ...

  4. Spring boot运行原理-自定义自动配置类

    在前面SpringBoot的文章中介绍了SpringBoot的基本配置,今天我们将给大家讲一讲SpringBoot的运行原理,然后根据原理我们自定义一个starter pom. 本章对于后续继续学习S ...

  5. SpringBoot源码学习系列之SpringMVC自动配置

    目录 1.ContentNegotiatingViewResolver 2.静态资源 3.自动注册 Converter, GenericConverter, and Formatter beans. ...

  6. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  7. SpringBoot集成Spring Security(2)——自动登录

    在上一章:SpringBoot集成Spring Security(1)——入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能. 文章目录 一.修改login.html二.两种实现方式 2. ...

  8. spring自定义自动配置注解

    我们知道springboot自动配置@EnableAutoConfiguration是通过@Import(AutoConfigurationImportSelector.class)来把自动配置组件加 ...

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

    Gradle实现自动打包,签名,自定义apk文件名 什么是签名,签名有什么用 Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行 ...

随机推荐

  1. Springboot统一配置Jackson

    经常要为接口响应对象设置属性,序列化的时候是不是包含空值,反序列化的时候是否忽略不认识的字段.所以,必须要手动制定ObjectMapper或者在类上声明 @JsonInclude(Include.NO ...

  2. 自绘LISTVIEW的滚动条(Delphi实现)

    因项目需要准备对LISTVIEW的滚动条进行自绘.于是在网上搜了一下,问题没解决,却搜出一篇令人不愉快的帖子 .确实,那时候实力是不够的,但现在应该是没问题了,为这个目的才不断磨练自己的. LISTV ...

  3. 图像滤镜艺术---Glow Filter发光滤镜

    原文:图像滤镜艺术---Glow Filter发光滤镜 Glow Filter发光滤镜 Glow Filter发光滤镜是一种让图像产生发光效果的滤镜,它的实现算法如下: 1,对原图P进行高斯模糊得到图 ...

  4. Image Captioning代码复现

    Image caption generation: https://github.com/eladhoffer/captionGen Simple encoder-decoder image capt ...

  5. SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败

    原文:SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败 今天发现队列读取器代理不停地尝试启动但总是出错: 其中内容如下: 队列读取器代理在连接"Publicati ...

  6. Android零基础入门第52节:自定义酷炫进度条

    原文:Android零基础入门第52节:自定义酷炫进度条 Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar. 在Android开发中 ...

  7. MySql 小内存优化

    MySql5.6启动内存近500M,如在小型机内存敏感的环境可能较大,下边配置会减少较多内存,至150M以下. performance_schema = OFF innodb_buffer_pool_ ...

  8. 桌面程序阻止Windows关机(使用Message.Result取得DefWindowProc API函数的返回值,非常重要)

    Windows Client 客户端在关机,不外乎两种情况: 1. 没有处理 Windows 关机消息: 2.处理了关机消息,但是超时了: 上面这两种情况,都会让Windows 关不了机.在现实生活中 ...

  9. 解释为什么.net 第一次请求比较慢

    通过这个图可以很好的解释为什么第一次请求比较慢,为了提高访问速度,也便有了预编译. 关于ASP.NET网站:每个页面都编译成一个.dll文件 用Assembly.GetExecutingAssembl ...

  10. echarts 中国地图标注所在点

    达到的效果: 1.本身是个中国地图‘ 2.直接通过经纬度标注 3.标注点可以是其他样子(比如:五角星) 4.标注点具有提示框并且鼠标可以进入 5.提示框里的链接可点击(可以添加为链接事件): 所需要技 ...