com.github.fashionbrot.common.util.BeanUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of common-spring Show documentation
Show all versions of common-spring Show documentation
common-spring 工具类 https://github.com/fashionbrot/common
package com.github.fashionbrot.common.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.SingletonBeanRegistry;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.support.AbstractApplicationContext;
import java.lang.reflect.Constructor;
@Slf4j
public class BeanUtil {
public static void registerBean(BeanDefinitionRegistry registry,String beanName,Class clazz) {
registerInfrastructureBeanIfAbsent(registry, beanName,clazz);
}
/**
* Register an object to be Singleton Bean
*
* @param registry {@link BeanDefinitionRegistry}
* @param beanName bean name
* @param singletonObject singleton object
*/
public static void registerSingleton(BeanDefinitionRegistry registry, String beanName, Object singletonObject) {
SingletonBeanRegistry beanRegistry = null;
if (registry instanceof SingletonBeanRegistry) {
beanRegistry = (SingletonBeanRegistry) registry;
} else if (registry instanceof AbstractApplicationContext) {
// Maybe AbstractApplicationContext or its sub-classes
beanRegistry = ((AbstractApplicationContext) registry).getBeanFactory();
}
// Register Singleton Object if possible
if (beanRegistry != null) {
beanRegistry.registerSingleton(beanName, singletonObject);
}
}
/**
* Register Infrastructure Bean if absent
*
* @param registry {@link BeanDefinitionRegistry}
* @param beanName the name of bean
* @param beanClass the class of bean
* @param constructorArgs the arguments of {@link Constructor}
*/
public static void registerInfrastructureBeanIfAbsent(BeanDefinitionRegistry registry, String beanName, Class> beanClass,
Object... constructorArgs) {
if (!isBeanDefinitionPresent(registry, beanName, beanClass) && !registry.containsBeanDefinition(beanName)) {
registerInfrastructureBean(registry, beanName, beanClass, constructorArgs);
}
}
/**
* Register Infrastructure Bean
*
* @param registry {@link BeanDefinitionRegistry}
* @param beanName the name of bean
* @param beanClass the class of bean
* @param constructorArgs the arguments of {@link Constructor}
*/
public static void registerInfrastructureBean(BeanDefinitionRegistry registry, String beanName, Class> beanClass,
Object... constructorArgs) {
// Build a BeanDefinition for serviceFactory class
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(beanClass);
for (Object constructorArg : constructorArgs) {
beanDefinitionBuilder.addConstructorArgValue(constructorArg);
}
// ROLE_INFRASTRUCTURE
beanDefinitionBuilder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
// Register
registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());
}
/**
* Is {@link BeanDefinition} present in {@link BeanDefinitionRegistry}
*
* @param registry {@link BeanDefinitionRegistry}
* @param beanName the name of bean
* @param targetBeanClass the type of bean
* @return If Present , return true
*/
public static boolean isBeanDefinitionPresent(BeanDefinitionRegistry registry, String beanName, Class> targetBeanClass) {
String[] beanNames = BeanUtil.getBeanNames((ListableBeanFactory) registry, targetBeanClass);
return ObjectUtil.contains(beanNames, beanName);
}
/**
* Get Bean Names from {@link ListableBeanFactory} by type.
*
* @param beanFactory {@link ListableBeanFactory}
* @param beanClass The {@link Class} of Bean
* @return If found , return the array of Bean Names , or empty array.
*/
public static String[] getBeanNames(ListableBeanFactory beanFactory, Class> beanClass) {
return getBeanNames(beanFactory, beanClass, false);
}
public static String[] getBeanNames(ListableBeanFactory beanFactory, Class> beanClass,
boolean includingAncestors) {
// Issue : https://github.com/alibaba/spring-context-support/issues/22
if (includingAncestors) {
return BeanFactoryUtils.beanNamesForTypeIncludingAncestors(beanFactory, beanClass, true, false);
} else {
return beanFactory.getBeanNamesForType(beanClass, true, false);
}
}
public static Object getSingleton(BeanFactory registry, String beanName) {
SingletonBeanRegistry beanRegistry = null;
if (registry instanceof SingletonBeanRegistry) {
beanRegistry = (SingletonBeanRegistry) registry;
} else if (registry instanceof AbstractApplicationContext) {
// Maybe AbstractApplicationContext or its sub-classes
beanRegistry = ((AbstractApplicationContext) registry).getBeanFactory();
}
if (beanRegistry != null) {
return beanRegistry.getSingleton(beanName);
}
return null;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy