当前位置: 首页 > 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
http://www.xdnf.cn/news/313597.html

相关文章:

  • 开源免费视频在线提取工具 MediaGo 介绍
  • 浅析MySQL 的 **触发器(Trigger)** 和 **存储过程(Stored Procedure)原理及优化建议
  • 核函数(Kernel function)
  • GPS定位方案
  • 微机控制技术复习【一】
  • 汇总区间(简单)
  • AI 数字短视频数字人源码开发实用技巧分享​
  • HCIP【STP、RSTP、MSTP协议(详解)】
  • Linux中为某个进程临时指定tmp目录
  • Go语言——string、数组、切片以及map
  • 今年我国已发生三级以上地震318次
  • 从创业踩雷到依法解债:湖北理元理律师事务所的危机拆解逻辑
  • 继电器负载知识
  • 小刚说C语言刷题—1044 -找出最经济型的包装箱型号
  • win11 怎样把D盘空间分给C盘一点
  • day18-API(常见API,对象克隆)
  • 将nginx设置成自启动,防止每次开机后都要自己手动启动
  • nginx服务--基础
  • C语言数组和函数的实践———扫雷游戏
  • 调用DeepSeek的API
  • 文献综述怎么写?高效阅读、智能整理,告别文献焦虑!
  • 感知器准则感知器神经元模型——等价
  • 电动双向金属硬密封蝶阀:四大领域流体控制的终极解决方案 -耀圣
  • Vue 项目中使用 EJS 模板动态注入环境变量
  • Vue3.5 企业级管理系统实战(十七):角色管理
  • String、StringBuilder、StringBuffer的区别
  • 0506--01-DA
  • TDengine 车联网案例
  • 2025.5.6总结
  • python setup.py install --user和pip install -e .的区别