首页 > 其他分享 >模拟springboot自动转配原理

模拟springboot自动转配原理

时间:2022-09-20 14:25:00浏览次数:83  
标签:springboot 转配 springframework context org import tlj class 模拟


package com.tlj.app;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;

import java.util.List;

/**
 * @Author: tlj
 * @Date: 2022/9/20
 * @Description:
 */
public class ApplicationTest {

    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        // 注册bean
        context.registerBean("config",Config.class);
        // 添加beanFactory后置处理器
        context.registerBean(ConfigurationClassPostProcessor.class);

        //启动容器
        context.refresh();

        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }

    }


    @Configuration
    @Import(MyImportSelector.class)
    static class Config {
    }

    static class MyImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//            return new String[]{autoConfiguration1.class.getName()};
            //  这么做的好处是将类的信息放到配置文件中 , 修改不需要修改代码,只需要修改配置文件
            List<String> names = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class, null);
            return names.toArray(new String[0]);
        }
    }


    @Configuration
    static class autoConfiguration1 {
        @Bean
	@ConditionalOnMissingBean
        public com.tlj.app.parta.Bean bean1() {
            return new com.tlj.app.parta.Bean();
        }
    }


}

reource 目录
image

spring.factories 文件

com.tlj.app.ApplicationTest$MyImportSelector=\
  com.tlj.app.ApplicationTest.autoConfiguration1

由于使用了内部类的方式,所以将.替换成了$

编写jar配置类的时候,如果要让使用者可以复写配置类中的某个bean,可以使用 @ConditionalOnMissingBean 注解

标签:springboot,转配,springframework,context,org,import,tlj,class,模拟
From: https://www.cnblogs.com/tanglianjie/p/16710851.html

相关文章

  • SpringBoot实战电商项目商城(50k+star)地址:github.com/macrozheng/...
    经常遇到小伙伴问我之前写的技术文章在哪里。或者用很久以前的部署文档问我,为什么不能按照这篇文章进行部署。其实如果他们上过我的实战教程网站,估计就不会出现这样的问题......
  • 2022.08.24 模拟赛小结
    2022.08.24模拟赛小结题面链接(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)更好的阅读体验戳此进入(建议您从上方链接进入我的个人网站查看此Blog,在Luo......
  • 2022.08.27 模拟赛小结
    2022.08.27模拟赛小结目录2022.08.27模拟赛小结题面更好的阅读体验戳此进入赛时思路T1T2T3T4正解T2T1T3T4UPD题面链接(这个链接只是为了自己方便找,页面设置权限了,不......
  • 2022.08.31 模拟赛小结
    2022.08.31模拟赛小结目录2022.08.31模拟赛小结题面更好的阅读体验戳此进入赛时思路T1T2T3正解UPD题面PDF链接原题题包(计蒜客)去掉了T4,其余有部分改动(这个链接只......
  • 2022.09.16 模拟赛小结(互测)
    2022.09.16模拟赛小结(互测)目录2022.09.16模拟赛小结(互测)题面更好的阅读体验戳此进入赛时思路T1CodeT2CodeT3CodeT4Code正解T1UPD题面PDF链接(这个链接只是为了自己方......
  • SpringBoot Xml转Json对象
    一、导入需要的依赖<dependency><groupId>maven</groupId><artifactId>dom4j</artifactId><version>1.7-20060614</version></dependency>二、xml......
  • springboot项目启动报错:找不到或无法加载主类 com....
    springboot项目报错找不到或无法加载主类com....1.如果是导入的别人的项目首先要配置好JDK和MAVEN然后点击右侧栏的maven图标--->点击clean(清除掉源有的配置)--》......
  • CSP-S模拟6
    T1玩水本来能拿八十分的,但是fileerror了,nnd赛时的做法没有考虑在同一行但不相邻的,只算了下前缀和,于是会误判。点击查看代码#include<bits/stdc++.h>typedeflon......
  • 20220919模拟赛反思
    时间分配不合理、自己浪费太多时间在第二题,然后最后没做出来。导致后面的题甚至没认真思考,只来得及打暴力打部分分技巧掌握不熟练。就如第三题N<=20的部分分打了1个多......
  • CSP-S模拟6
    从今往后,教室里再也没有我们的一席之地了**希望我高中毕业之前再也不要回去***A.玩水针对n=2的数据点思考了一下,发现了对角线这个事,于是我就判断的一下能找到两个对角线......