当前位置: 首页 > news >正文

通过Config批量注入对象到Spring IoC容器

  • 配置文件
  • FactoryBean
  • InitSftpBean
  • ImportBeanDefinitionRegistrar
  • AutoConfiguration

通过配置文件,自动创建多个不同属性的对象,并将其放入Spring IoC容器中进行托管。

配置文件

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.Map;@ConfigurationProperties(prefix = "ftp.sftp")
@Data
public class SftpProperties {private Map<String, SftpClientConfig> configMap;
}@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SftpClientConfig implements Serializable {private static final long serialVersionUID = -5169810629220643782L;/*** 主机ip*/private String host;/*** 端口号*/private int port;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 连接sftp服务器,默认超时时间12000*/private int timeout = 12000;
}

FactoryBean

import lombok.Setter;
import org.springframework.beans.factory.FactoryBean;@Setter
public class SftpClientPoolFactoryBean implements FactoryBean<SftpClientPool> {private SftpClientPoolConfig poolConfig;private SftpClientFactory factory;@Overridepublic SftpClientPool getObject() throws Exception {return new SftpClientPool(factory, poolConfig);}@Overridepublic Class<?> getObjectType() {return SftpClientPool.class;}
}

InitSftpBean

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.Ordered;
import org.springframework.util.CollectionUtils;import java.util.Map;@Slf4j
public class InitSftpBean implements InitializingBean, Ordered {private SftpProperties sftpProperties;private BeanDefinitionRegistry registry;public InitSftpBean(SftpProperties sftpProperties) {this.sftpProperties= sftpProperties;}public void setRegistry(BeanDefinitionRegistry registry) {this.registry = registry;}@Overridepublic void afterPropertiesSet() throws Exception {Map<String, SftpClientConfigBO> propertiesMap = sftpProperties.getConfigMap();log.info("sftpConfig>>>init sftp, propertiesMap={}", JSON.toJSONString(propertiesMap));if (CollectionUtils.isEmpty(propertiesMap)) {return;}propertiesMap.values().stream().forEach(config -> {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(SftpClientPoolFactoryBean.class);MutablePropertyValues propertyValues = new MutablePropertyValues();// 添加属性propertyValues.add("poolConfig", config.getPool() == null ? getDefaultConfig() : config.getPool());propertyValues.add("factory", new SftpClientFactory(config));rootBeanDefinition.setPropertyValues(propertyValues);// 懒加载rootBeanDefinition.setLazyInit(true);// registerregistry.registerBeanDefinition(config.getBeanName(), rootBeanDefinition);});}private SftpClientPoolConfig getDefaultConfig() {SftpClientPoolConfig config = new SftpClientPoolConfig();config.setMinIdle(2);config.setMaxIdle(2);config.setMaxTotal(2);return config;}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

ImportBeanDefinitionRegistrar

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;@Slf4j
public class SFtpImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {MutablePropertyValues propertyValues = new MutablePropertyValues();propertyValues.add("registry", registry);RootBeanDefinition initSftpBean = new RootBeanDefinition(InitSftpBean.class);initSftpBean.setPropertyValues(propertyValues);initSftpBean.setPrimary(true);registry.registerBeanDefinition("initSftpBean", InitSftpBean);}
}

AutoConfiguration

@AutoConfiguration
@Slf4j
@EnableConfigurationProperties({SftpProperties.class, FtpProperties.class})
@ConditionalOnProperty(prefix = "sftp.global", value = "enable", havingValue = "true")
@Import(SFtpImportBeanDefinitionRegistrar.class)
public class SFtpConfig {
}

添加spring.factories文件内容:
目录:src/main/resources/META-INF/services

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.test.config.SFtpConfig

相关文章:

  • Qt开发经验 --- 避坑指南(4)
  • 十分钟了解 @MapperScan
  • LeetCode 热题 100 22. 括号生成
  • 大学之大:隆德大学2025.5.6
  • JSON 转换为 Word 文档
  • SLAM算法工程师面经大全:2025年面试真题解析与实战指南
  • 个人Unity自用面经(未完)
  • Three.js 基础与实践
  • JavaSE核心知识点01基础语法01-04(数组)
  • QQMUSIC测试报告
  • 双目标清单——AI与思维模型【96】
  • 智能机器人赋能小天互连IM系统,打造高效办公新生态
  • cephadm部署ceph集群
  • Flowable7.x学习笔记(二十)查看流程办理进度图
  • 从零开始学习人工智能Day6-Python3标准库概览
  • 【AI提示词】六顶思考帽工具专家
  • 智能学习空间的范式革新:基于AI驱动的自习室系统架构与应用研究
  • 使用DevTools工具调试前端页面,便捷脚本,鸿蒙调试webView
  • PyTorch常用命令详解:助力深度学习开发
  • day18-API(常见API,对象克隆)
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动
  • 中国社联成立95周年,《中国社联期刊汇编》等研究丛书出版
  • 师爷、文士、畸人:会稽范啸风及其著述
  • 手机表面细菌菌落总数可能比马桶高10倍,医生详解如何洗手
  • 消息人士称泽连斯基已启程前往土耳其
  • 京东CEO许冉:外卖日单量接近2000万单,看到外卖对平台拉动和转化效应