【问题标题】:Discovery beans from dynamically loaded jar in JBoss AS 7.1从 JBoss AS 7.1 中动态加载的 jar 中发现 bean
【发布时间】:2013-07-03 16:23:11
【问题描述】:
【问题讨论】:
标签:
plugins
jboss7.x
cdi
weld
【解决方案1】:
该类用于与应用服务器集成。 CDI 旨在为应用程序在启动时加载所有内容。要做你正在寻找的事情,你必须启动一个新的 Weld 实例并传递所有内容并自己进行引导。老实说,我不知道在您的应用程序中执行此操作会产生什么影响,但我可以告诉您,这会让您非常头疼。
【解决方案2】:
其实我在http://relation.to/12981.laceGavin King 的这篇文章中找到了答案
基本上我必须像这样创建一个扩展并映射 afterBeanDiscovery 事件:
public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
for ( final Class c: getBeanClasses() ) {
//use this to read annotations of the class
AnnotatedType at = bm.createAnnotatedType(c);
//use this to create the class and inject dependencies
final InjectionTarget it = bm.createInjectionTarget(at);
abd.addBean( new Bean() {
@Override
public Class<?> getBeanClass() {
return c;
}
@Override
public Set<InjectionPoint> getInjectionPoints() {
return it.getInjectionPoints();
}
@Override
public String getName() {
String s = c.getSimpleName();
s = Character.toLowerCase( s.charAt(0) ) + s.substring(1);
return s;
}
@Override
public Set<Annotation> getQualifiers() {
Set<Annotation> qualifiers = new HashSet<Annotation>();
qualifiers.add( new AnnotationLiteral<Default>() {} );
qualifiers.add( new AnnotationLiteral<Any>() {} );
return qualifiers;
}
@Override
public Class<? extends Annotation> getScope() {
return Dependent.class;
}
@Override
public Set<Class<? extends Annotation>> getStereotypes() {
return Collections.emptySet();
}
@Override
public Set<Type> getTypes() {
Set<Type> types = new HashSet<Type>();
types.add(c);
types.add(Object.class);
return types;
}
@Override
public boolean isAlternative() {
return false;
}
@Override
public boolean isNullable() {
return false;
}
@Override
public Object create(CreationalContext ctx) {
Object instance = it.produce(ctx);
it.inject(instance, ctx);
it.postConstruct(instance);
return instance;
}
@Override
public void destroy(Object instance, CreationalContext ctx) {
it.preDestroy(instance);
it.dispose(instance);
ctx.release();
}
} );
}
}
我还必须扫描我的 jar 中的 bean 类,但这没什么大不了的。找到类后,我将其包含在 getBeanClasses() 列表中。
现在我正在寻找有关如何在运行时包含 JPA 实体的解决方案。
但是现在这个问题已经解决了。