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