Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save johnnian/91e1c4d8a0d80e3d953326c6b5b0e62e to your computer and use it in GitHub Desktop.
Save johnnian/91e1c4d8a0d80e3d953326c6b5b0e62e to your computer and use it in GitHub Desktop.
SpringBoot手动装载Bean
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.AnnotationScopeMetadataResolver;
import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.context.annotation.ScopeMetadataResolver;
import com.mallcoo.util.PropertiesManager;
/**
* 手动注册Bean: 替换原先Spring下使用xml注入bean
* @author Johnnian
*
* 加载顺序:
* 1、postProcessBeanDefinitionRegistry
* 2、postProcessBeanFactory: 可以在这里配置自定义的属性
*
*/
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
private ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver();
private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
//从BeanFactory拉去Bean
BeanDefinition bd = beanFactory.getBeanDefinition("propertiesManager");
//添加属性
MutablePropertyValues mpv = bd.getPropertyValues();
mpv.addPropertyValue("systemPropertiesModeName", "SYSTEM_PROPERTIES_MODE_OVERRIDE");
mpv.addPropertyValue("ignoreResourceNotFound", true);
List<String>configPath = new ArrayList<>();
configPath.add("classpath*:/deploy.properties");
configPath.add("classpath*:/config.properties");
mpv.addPropertyValue("locations", configPath);
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// TODO Auto-generated method stub
//注册:读取属性文件
registerBean(registry, "propertiesManager", PropertiesManager.class);
}
/**
* 注册Bean
* @param registry
* @param name
* @param beanClass
*/
private void registerBean(BeanDefinitionRegistry registry, String name, Class<?> beanClass){
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, registry));
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment