Java 如何使用反射自动注册Springbean
我的应用程序由两个模块组成,我在Java 如何使用反射自动注册Springbean,java,spring,reflection,spring-bean,Java,Spring,Reflection,Spring Bean,我的应用程序由两个模块组成,我在module-B下有一些类,我想要的是在module-A中动态加载module-B的jar,并将这些类注册为module-A的上下文中的bean 我在module-B下没有任何context,因此在我的父module-A中加载module-B的上下文对我来说不是一个选项 到目前为止,我所尝试的: ,但我不知道如何注册这些bean 我错过了什么?有没有更好的方法,不用在子模块中创建上下文并在父模块中加载它们。使用ClassPathXmlApplicationCont
module-B
下有一些类,我想要的是在module-A
中动态加载module-B
的jar
,并将这些类注册为module-A
的上下文中的bean
我在module-B
下没有任何context
,因此在我的父module-A
中加载module-B
的上下文对我来说不是一个选项
到目前为止,我所尝试的:
,但我不知道如何注册这些bean
我错过了什么?有没有更好的方法,不用在子模块中创建上下文并在父模块中加载它们。使用ClassPathXmlApplicationContext上下文来配置module-a内容,然后可以加载module-B jar,并使用以下代码添加bean
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();
public void addComponent(Object component) {
if (component instanceof Class) {
Class clazz = (Class) component;
GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(clazz);
beanDef.setAutowireCandidate(true);
beanDef.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
String beanName = clazz.getName();
beanFactory.registerBeanDefinition(beanName, beanDef);
} else {
beanFactory.registerSingleton(component.getClass().getName(), component);
}
}
DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)上下文;
公共组件(对象组件){
if(类的组件实例){
类clazz=(类)组件;
GenericBeanDefinition beanDef=新的GenericBeanDefinition();
beanDef.setBeanClass(clazz);
beanDef.setAutowire候选者(true);
setAutowireMode(AbstractBeanDefinition.AUTOWIRE\u构造函数);
字符串beanName=clazz.getName();
beanFactory.registerBeanDefinition(beanName,beanDef);
}否则{
registerSingleton(component.getClass().getName(),component);
}
}
使用ClassPathXmlApplicationContext上下文配置module-A内容,然后可以加载module-B jar,并使用以下代码添加bean
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();
public void addComponent(Object component) {
if (component instanceof Class) {
Class clazz = (Class) component;
GenericBeanDefinition beanDef = new GenericBeanDefinition();
beanDef.setBeanClass(clazz);
beanDef.setAutowireCandidate(true);
beanDef.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
String beanName = clazz.getName();
beanFactory.registerBeanDefinition(beanName, beanDef);
} else {
beanFactory.registerSingleton(component.getClass().getName(), component);
}
}
DefaultListableBeanFactory beanFactory=(DefaultListableBeanFactory)上下文;
公共组件(对象组件){
if(类的组件实例){
类clazz=(类)组件;
GenericBeanDefinition beanDef=新的GenericBeanDefinition();
beanDef.setBeanClass(clazz);
beanDef.setAutowire候选者(true);
setAutowireMode(AbstractBeanDefinition.AUTOWIRE\u构造函数);
字符串beanName=clazz.getName();
beanFactory.registerBeanDefinition(beanName,beanDef);
}否则{
registerSingleton(component.getClass().getName(),component);
}
}
为什么您要手动执行此操作,而不是使用组件扫描和/或自动配置?我没有使用组件扫描
,因为这些类不在我的模块-A类路径上
,我需要以某种方式动态地将它们加载到类路径
或者以某种方式组件扫描
模块-B
类路径
。模块A中的类是否仅在编译时不在模块B的类路径上,或者在运行时也不在类路径上?模块-A
是父模块,它需要来自module-B
的类,现在这些类在编译时和运行时都不存在,除非我在运行时动态加载它们。您确实需要重新组织模块,以准确反映您的依赖关系。为什么您要手动执行此操作,而不是使用组件扫描和/或自动配置?我没有使用组件扫描
,因为这些类不在我的模块-A类路径
,我需要以某种方式动态地将它们加载到类路径
或者以某种方式组件扫描
模块-B
类路径
。模块A中的类是否仅在编译时不在模块B的类路径上,或者在运行时也不在类路径上?模块-A
是父模块,它需要来自module-B
的类,现在这些类在编译时和运行时都不存在,除非我在运行时动态加载它们。您确实需要重新组织模块,以准确反映您的依赖关系。