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需要做以下几件事##

  1. 创建一个maven工程,写一个自己的@Configuration
  2. 在META-INF文件夹下面创建spring.factories文件,配置自己刚刚的Configuration类路径。
  3. 打包到仓库。
  4. 新建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的更多相关文章

  1. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  2. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

  3. SpringBoot | 2.1 SpringBoot自动装配原理

    @ 目录 前言 1. 引入配置文件与配置绑定 @ImportResource @ConfigurationProperties 1.1 @ConfigurationProperties + @Enab ...

  4. SpringBoot自动装配原理解析

    本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...

  5. 【Springboot】Springboot自动装配原理

    1.核心注解就是 EnableAutoConfiguration  该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...

  6. springboot自动装配原理回顾、配置文件分析

    配置文件 spring boot官方文档 官方外部配置文件说明参考文档 自动配置原理分析 1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfigurat ...

  7. SpringBoot 自动装配原理

    早期的Spring项目需要添加需要配置繁琐的xml,比如MVC.事务.数据库连接等繁琐的配置.Spring Boot的出现就无需这些繁琐的配置,因为Spring Boot基于约定大于配置的理念,在项目 ...

  8. SpringBoot自动装配原理之Configuration以及@Bean注解的使用

    Configuration以及Bean注解的使用 该知识点在Spring中应该学过,没有学过或者遗忘的的朋友需要预习或温习前置知识点.SpringBoot其实就是Spring的进一步简化,所以前置知识 ...

  9. SpringBoot:带你认认真真梳理一遍自动装配原理

    前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...

随机推荐

  1. 九、Python+Selenium模拟登录

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...

  2. 设计完美windbg断点

    说到现场调试,断点是最重要的.通常,在生产环境中解决一个非常复杂的问题需要在本地.非生产环境中调试我自己的一台测试机器.我通常会调试有问题的进程或代码,以便更好地了解它是如何工作的,以及在我进入时需要 ...

  3. Linux 杀毒软件ClamAV安装部署

    环境说明 系统安全需求,批量安装免费杀毒软件: 操作系统统一为CentOS 7 x64,在此选择免费开源杀毒软件ClamAV: 两种安装方式 1.yum 安装: 2.源码包编译安装: 安装参考网址: ...

  4. 《流畅的Python》 第一部分 序章 【数据模型】

    流畅的Python 致Marta,用我全心全意的爱 第一部分 序幕 第一章 Python数据模型 特殊方法 定义: Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语 ...

  5. 2020 CSP-J 初赛答案及解析

    部分咕咕咕的明天一定 单项选择 A A D 解析 : 与z的都是假 C 解析 : $ \frac{2048\times1024\times32}{8\times1024\times1024}=8$ C ...

  6. shell-变量的字串应用技术

    1. 变量子串的常用操作 常用操作如下表: 依次举例说明: 定义aa变量,内容为"I am scajy" [root@1-241 script]# aa="I am sc ...

  7. MeteoInfoLab脚本示例:Streamline流线图

    绘制Stramline流线图的函数是streamline,需要两个变量(U/V分量或者风向/风速).脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') u = f ...

  8. 数组的高级应用含ES6 for of 用法

    // 在ES5中常用的10种数组遍历方法: // 1. 原始的for循环语句 // 2. Array.prototype.forEach数组对象内置方法 // 3. Array.prototype.m ...

  9. 使用notepad++的nppexec插件格式化json和压缩json内容

    1.遇到问题 因为平时需要查看json内容,有时候修改后需要压缩json,虽然已经有网页可以实现,但每次打开网页也很麻烦啊.虽然notpad++也有NPPJSONViewer这个插件,但是目前只有格式 ...

  10. 以太坊PoW

    ethash ethash(eth+hash)是以太坊设计的挖矿算法,为了实现ASIC-resistance,ethash依赖于对内存资源的访问,是一种memory-hard函数.同时为了支持轻节点对 ...