简体   繁体   English

在动态加载的类中扫描组件

[英]Scan components in dynamically loaded classes

Am looking for away to scan and register all components, after loading jar file in run time using URLClassLoader , the jar file just contains class annotated with @Component etc ... I have tried 我正在寻找远程扫描注册所有组件,在运行时使用URLClassLoader加载jar文件后,jar文件只包含用@Component等注释的 ...我试过了

GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(MyClass.class);
beanFactory.registerSingleton("myBean", bd);

and

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) ctx).getBeanFactory();
    beanFactory.createBean(MyClass.class);

but didn't work, is there away to achieve that ? 但没有工作,有没有实现呢?

after searching and trying, this worked 经过搜索和尝试,这个工作

public Class<?> loadAllJarClasses(String pathToJar, String mainClassName) {

        Class<?> clazz = null;
        Class c;

        try {

            JarFile jarFile = new JarFile(pathToJar);
            Enumeration<JarEntry> e = jarFile.entries();

            URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
            URLClassLoader cl = URLClassLoader.newInstance(urls);

            while (e.hasMoreElements()) {
                JarEntry je = e.nextElement();
                if (je.isDirectory() || !je.getName().endsWith(".class")) {
                    continue;
                }
                // -6 because of .class
                String className = je.getName().substring(0, je.getName().length() - 6);
                className = className.replace('/', '.');
                logger.info("loading " + className);
                c = cl.loadClass(className);
                resgisterBean(c);
                logger.info("loaded " + className);
                if (className.equalsIgnoreCase(mainClassName))
                    clazz = c;

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clazz;
    }

    public void resgisterBean(Class<?> clazz) {

         beanFactory = (BeanDefinitionRegistry) ((ConfigurableApplicationContext) ctx)
                .getBeanFactory();

        beanFactory.registerBeanDefinition(clazz.getName(),
                BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition());
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM