问题描述
我已经手动创建了 Spring Bean,但我无法解决以下问题。首先,我描述了我的应用程序中正在运行的部分。我有一堆注入到 HandlerConfiguration 类中的处理程序。在这个类中,我创建了一个 HashMap,其中填充了用于特定实体对象的处理程序的信息。
@Configuration
public class HandlerConfiguration {
@Autowired
private List<Handler<?>> entityHandlers;
@Bean(name = "catalog")
@Scope("prototype")
public Map<Class<?>,Handler<?>> getHandlerCatalog() {
Map<Class<?>,Handler<?>> handlers = new HashMap<Class<?>,Handler<?>>();
entityHandlers.stream().forEach(
handler -> handlers.put((Class<?>) ((ParameterizedType) handler.getClass().getGenericInterfaces()[0])
.getActualTypeArguments()[0],handler));
return handlers;
}
}
HashMap 稍后在 Runner 类中用于运行特定处理程序。这部分工作得很好。
@Component
public class Runner {
@Resource(name = "catalog")
Map<Class<?>,Handler<Entity>> entityHandlers;
@Override
public void run(Tour tour) {
tour.getEntities().forEach(entity -> entityHandlers.get(entity.getClass()).run(entity));
}
}
现在我创建了一个集成测试,我想手动创建配置,但我的实体 Handlers HashMap 为空。我创建了如下测试:
@RunWith(springrunner.class)
@ContextConfiguration(initializers = Test.Initializer.class)
@EnableTransactionManagement
class Test {
static class Initializer implements ApplicationContextinitializer<ConfigurableApplicationContext> {
public void initialize(ConfigurableApplicationContext applicationContext) {
List<EntityHandler<?>> entityHandlersList = new ArrayList<>();
var provider = new ClasspathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));
final Set<BeanDeFinition> beanDeFinitions = provider
.findCandidateComponents("com.xyz.handler.dnd");
for (BeanDeFinition className : beanDeFinitions) {
Class<?> cls = Class.forName(className.getBeanClassName());
entityHandler.class.isAssignableFrom(cls);
if (EntityHandler.class.isAssignableFrom(cls)) {
EntityHandler<?> newInstance = (EntityHandler<?>) cls.newInstance();
entityHandlersList.add(newInstance);
ctx.getbeanfactory().registerSingleton(className.getBeanClassName(),newInstance);
}
}
Map<Class<?>,Handler<?>> entityHandlers = new HashMap<Class<?>,Handler<?>>();
entityHandlersList.stream()
.forEach(
handler -> entityHandlers.put(
(Class<?>) ((ParameterizedType) handler.getClass().getGenericInterfaces()[0])
.getActualTypeArguments()[0],ctx.getbeanfactory().getBean(handler.getClass())));
GenericBeanDeFinition entityHandlerCatalog = new GenericBeanDeFinition();
entityHandlerCatalog.setBeanClass(HashMap.class);
entityHandlerCatalog.setAutowireCandidate(true);
entityHandlerCatalog.setScope(BeanDeFinition.ScopE_PROTOTYPE);
ctx.registerBeanDeFinition("entityHandlerCatalog",entityHandlerCatalog);
}
}
@Test
void test() throws Exception {
...
}
}
entityHandlerCatalog 中的信息是正确的,但问题似乎出在我创建 GenericBeanDeFinition 的方式上。还是我走错了路?
提前致谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)