Created
June 20, 2017 01:30
-
-
Save johnnian/91e1c4d8a0d80e3d953326c6b5b0e62e to your computer and use it in GitHub Desktop.
SpringBoot手动装载Bean
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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