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


通过配置文件,自动创建多个不同属性的对象,并将其放入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;

    @Override
    public SftpClientPool getObject() throws Exception {
        return new SftpClientPool(factory, poolConfig);
    }

    @Override
    public 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;
    }

    @Override
    public 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);
            // register
            registry.registerBeanDefinition(config.getBeanName(), rootBeanDefinition);
        });
    }

    private SftpClientPoolConfig getDefaultConfig() {
        SftpClientPoolConfig config = new SftpClientPoolConfig();
        config.setMinIdle(2);
        config.setMaxIdle(2);
        config.setMaxTotal(2);
        return config;
    }

    @Override
    public 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 {

    @Override
    public 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值