欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 通过Config批量注入对象到Spring IoC容器

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

2025/5/7 22:30:06 来源:https://blog.csdn.net/qq_33375499/article/details/147738209  浏览:    关键词:通过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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词