springboot自动装配原理,写一个自己的start
springboot自动装配原理
第一次使用springboot的时候,都感觉很神奇。只要加入一个maven的依赖,写几行配置,就能注入redisTemple,rabbitmqTemple等对象。
这一切要从spring的的@bean和@Configuration注解说起
如果spring扫描到一个类加了@Configuration注解,那么这个类下面的@bean注解的返回对象就会注册到spring的容器里面
然后就能通过@Autowired注解获取bean

以springboot里面的RabbitAutoConfiguration为例子,他位于boot.autoconfigure包下面。只要spring容器扫描到这个类,就能把类下面的bean对象注册到容器。

那么现在的问题是,$\color{red}{怎么告诉spring容器@Configuration的类路径}$
这个就是springboot要做的事。
springboot启动的时候会扫描所以依赖的jar包下面的META-INF文件夹下面的spring.factories文件。
然后找这个文件的关键字org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ ,这个关键字后面的字符串就是告诉spring要加载哪些@Configuration的类

所以要写一个自己的start需要做以下几件事##
- 创建一个maven工程,写一个自己的
@Configuration类 - 在META-INF文件夹下面创建spring.factories文件,配置自己刚刚的Configuration类路径。
- 打包到仓库。
- 新建springboot工程引用刚刚的包依赖。
开始
一、创建一个maven工程,写一个自己的@Configuration类
我写了一个自己的EujianRedisTemplate类,用来操作redis
pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bootstart</groupId>
<artifactId>eujian-spring-boot-starter</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
写EujianRedisTemplate类
import org.springframework.cglib.core.internal.Function;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class EujianRedisTemplate {
private JedisPool pool;
public EujianRedisTemplate(JedisPool pool) {
this.pool = pool;
}
public String getString(String key){
String value = redisFun(jedis -> {
return jedis.get(key);
});
return value;
}
public void setString (String key,String object){
redisFun(jedis -> {
jedis.set(key,object);
return null;
});
}
public <T>T redisFun (Function<Jedis,T> function){
Jedis resource = pool.getResource();
T apply = function.apply(resource);
resource.close();
return apply;
}
}
EujianProperties用于读取配置
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("eujian.redis")
public class EujianProperties {
private String host = "127.0.0.1";
private Integer port = 6379;
private Integer timeout = 2000;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public Integer getTimeout() {
return timeout;
}
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
AutoConfig类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
@EnableConfigurationProperties(EujianProperties.class)
public class AutoConfig {
@Autowired
private EujianProperties eujianProperties;
@Bean
public JedisPool jedisPool (){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(8);
config.setMaxTotal(18);
JedisPool pool = new JedisPool(config, eujianProperties.getHost(), eujianProperties.getPort(), eujianProperties.getTimeout(), eujianProperties.getPassword());
return pool;
}
@Bean
public EujianRedisTemplate eujianJedis (JedisPool jedisPool){
return new EujianRedisTemplate(jedisPool);
}
}
二、 在META-INF文件夹下面创建spring.factories文件,配置自己刚刚的Configuration类路径。
在resources下面新建META-INF文件夹,再新建spring.factories文件
文件内容如下
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.bootstart.maven.AutoConfig
三、执行mvn install打包到本地
四、新建一个boot工程,pom依赖增加dependency如下
<dependency>
<groupId>com.bootstart</groupId>
<artifactId>eujian-spring-boot-starter</artifactId>
<version>1.0</version>
</dependency>
application.properties文件增加配置
eujian.redis.host=39.108.83.105
编写单元测试类
import com.bootstart.maven.EujianRedisTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootstartApplicationTests {
@Autowired
private EujianRedisTemplate eujianRedisTemplate;
@Test
public void contextLoads() {
eujianRedisTemplate.setString("1","qw");
String string = eujianRedisTemplate.getString("1");
System.out.println(string);
}
}
执行单元测试,EujianRedisTemplate类注入成功
boot项目地址
github: https://github.com/hd-eujian/bootstart.git
码云:https://gitee.com/guoeryyj/bootstart.git
maven项目地址
github: https://github.com/hd-eujian/maven-start.git
码云: https://gitee.com/guoeryyj/maven-start.git
springboot自动装配原理,写一个自己的start的更多相关文章
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- springboot自动装配原理
最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...
- SpringBoot | 2.1 SpringBoot自动装配原理
@ 目录 前言 1. 引入配置文件与配置绑定 @ImportResource @ConfigurationProperties 1.1 @ConfigurationProperties + @Enab ...
- SpringBoot自动装配原理解析
本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...
- 【Springboot】Springboot自动装配原理
1.核心注解就是 EnableAutoConfiguration 该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...
- springboot自动装配原理回顾、配置文件分析
配置文件 spring boot官方文档 官方外部配置文件说明参考文档 自动配置原理分析 1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfigurat ...
- SpringBoot 自动装配原理
早期的Spring项目需要添加需要配置繁琐的xml,比如MVC.事务.数据库连接等繁琐的配置.Spring Boot的出现就无需这些繁琐的配置,因为Spring Boot基于约定大于配置的理念,在项目 ...
- SpringBoot自动装配原理之Configuration以及@Bean注解的使用
Configuration以及Bean注解的使用 该知识点在Spring中应该学过,没有学过或者遗忘的的朋友需要预习或温习前置知识点.SpringBoot其实就是Spring的进一步简化,所以前置知识 ...
- SpringBoot:带你认认真真梳理一遍自动装配原理
前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...
随机推荐
- 上部:问道 | R语言数据分析(北京邮电大学)自整理笔记
第1章 气象万千 数以等观 数据分析:发现数据背后的规律 等号的重要性,建立模型 第2章所谓学习.归类而已 2.1所谓学习,归类而已(1) ps:机器学习只是归归类? 有监督学习--分类:无监督学习- ...
- 如何快速构建React组件库
前言 俗话说:"麻雀虽小,五脏俱全",搭建一个组件库,知之非难,行之不易,涉及到的技术方方面面,犹如海面风平浪静,实则暗礁险滩,处处惊险- 目前团队内已经有较为成熟的 Vue 技术 ...
- Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)
本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚入门的小白 ...
- pytest文档43-元数据使用(pytest-metadata)
前言 什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助. pytest 框架里面的元数据可以使用 pytest-metadata 插件实现.文档地址http ...
- 【原创】有利于提高xenomai 实时性的一些配置建议
版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.影响因素 1.硬件 2.BISO(X86平台) 3.软件 4. 缓存使用策略与GPU 二.优化措施 1. BIO ...
- anaconda 取消每次默认启动base环境
安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境 方法一: 每次在命令行通过conda deactivate退出base环境回到系统自动的环境 方法二 1,通过将a ...
- 详解Kubernetes微服务自动化发布系统
实施微服务架构后,原先单一的系统结构统变成了数量众多的微服务应用,开发.测试.运维部署等都会面临不少挑战.在微服务架构下如何提高工程研发效率,确保开发.测试.运维部署等流程上的顺畅,是微服务技术体系能 ...
- MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
开心一刻 产品还没测试直接投入生产时,这尼玛... 背景问题 在讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了 1.Ora ...
- Android面试题收录及解答10月刊
前言 嗨,大家好,好久不见.这里跟大家侃侃这中间发生了什么. 一个月前呢,想准备面试,就网上随便找找面试题什么的,发现要么就是卖课的,要么就是不给详细回答的或者回答不够深的(也许是我没找到).反正稍微 ...
- Retrofit学习
---恢复内容开始--- public class MainActivity extends AppCompatActivity { @Override protected void onCreate ...