通过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