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

Java 扫描动态加载类中的组件,java,spring,Java,Spring,我正在寻找扫描和注册所有组件,在运行时使用URLClassLoader加载jar文件后,jar文件只包含用@Component等注释的类。。。 我试过了 GenericBeanDefinition bd = new GenericBeanDefinition(); bd.setBeanClass(MyClass.class); beanFactory.registerSingleton("myBean", bd); 及 但是不起作用,有没有办法做到这一点呢?在搜索和尝试之后,这

我正在寻找扫描注册所有组件,在运行时使用
URLClassLoader
加载jar文件后,jar文件只包含用@Component等注释的类。。。 我试过了

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


但是不起作用,有没有办法做到这一点呢?

在搜索和尝试之后,这个方法奏效了

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());
    }
public类loadAllJarClasses(字符串pathToJar,字符串mainClassName){
类clazz=null;
丙级;;
试一试{
JarFile JarFile=新的JarFile(pathToJar);
枚举e=jarFile.entries();
URL[]URL={newurl(“jar:file:+pathToJar+”!/”};
URLClassLoader cl=URLClassLoader.newInstance(URL);
而(e.hasMoreElements()){
JarEntry je=e.nextElement();
if(je.isDirectory()| |!je.getName().endsWith(“.class”)){
继续;
}
//-6因为上课
字符串className=je.getName().substring(0,je.getName().length()-6);
className=className.replace(“/”,“.”);
logger.info(“加载”+类名);
c=cl.loadClass(类名);
菜豆(c);
logger.info(“已加载”+类名);
if(className.equalsIgnoreCase(mainClassName))
clazz=c;
}
}捕获(例外e){
e、 printStackTrace();
}
回击声;
}
public void resgisterBean(类clazz){
beanFactory=(BeanDefinitionRegistry)((ConfigurableApplicationContext)ctx)
.getBeanFactory();
beanFactory.registerBeanDefinition(clazz.getName(),
genericBeanDefinition(clazz.getBeanDefinition());
}

您可能需要创建一个新的应用程序上下文作为主应用程序上下文的子应用程序上下文。
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());
    }