Spring手动创建bean并注册工具类SpringBeanUtil

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractRefreshableApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;

/**
 * @author angryfun
 * @date 2021/9/3
 */
public class SpringBeanUtil {

    public static Object registerSingletonBean(ApplicationContext ctx, String beanName, Object singletonObject) {
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory();
        beanFactory.registerSingleton(beanName, singletonObject);
        return ctx.getBean(beanName);
    }

    public static boolean addBean(ApplicationContext ctx, String beanName, Class beanClass, Object... constructValues) {
        BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory)((AbstractRefreshableApplicationContext)ctx).getBeanFactory();
        if(beanDefReg.containsBeanDefinition(beanName)) {
            return false;
        }
        BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClass);
        for (Object constructValue : constructValues) {
            beanDefBuilder.addConstructorArgValue(constructValue);
        }
        BeanDefinition beanDefinition = beanDefBuilder.getBeanDefinition();
        beanDefReg.registerBeanDefinition(beanName, beanDefinition);
        return true;
    }

    public static void removeBean(ApplicationContext ctx, String beanName) {
        BeanDefinitionRegistry beanDefReg = (DefaultListableBeanFactory)((AbstractRefreshableApplicationContext)ctx).getBeanFactory();
        beanDefReg.removeBeanDefinition(beanName);
    }

    private static final String RESOURCE_PATTERN = "/**/*.class";

    public static Map<String, Class> findAllClass(String basePackage, Class cls) {
        Map<String, Class> handlerMap = new HashMap<>();

        //spring工具类,可以获取指定路径下的全部类
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        try {
            String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                    ClassUtils.convertClassNameToResourcePath(basePackage) + RESOURCE_PATTERN;
            Resource[] resources = resourcePatternResolver.getResources(pattern);
            //MetadataReader 的工厂类
            MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
            for (Resource resource : resources) {
                //用于读取类信息
                MetadataReader reader = readerfactory.getMetadataReader(resource);
                //扫描到的class
                String classname = reader.getClassMetadata().getClassName();
                Class<?> clazz = Class.forName(classname);
                if(cls.isAnnotation()) {
                    Object anno = clazz.getAnnotation(cls);
                    if (anno != null) {
                        handlerMap.put(clazz.getSimpleName(), clazz);
                    }
                }else if(cls.isAssignableFrom(clazz)) {
                    handlerMap.put(clazz.getSimpleName(), clazz);
                }
            }
        } catch (IOException | ClassNotFoundException e) {
        }
        return handlerMap;
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值