Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-通过CDI注入代理_Java_Cdi - Fatal编程技术网

java-通过CDI注入代理

java-通过CDI注入代理,java,cdi,Java,Cdi,在我的项目中,我有一些外部Java接口(所以我不能更改它们)。 例如 在bean中,我喜欢通过注入使用这个接口。 例如 但我没有这个接口的实现或生产者方法。相反,我正在寻找一种为这个接口注入通用代理的方法 我想,我需要像cdi这样的扩展来做这样的事情。不幸的是,我找不到任何好方法来解决这个问题。 在一个最优的世界里,我希望实现这样一种方法 public Object produce( Class< ? > type ) { if(isMyType(type)) {

在我的项目中,我有一些外部Java接口(所以我不能更改它们)。 例如

在bean中,我喜欢通过注入使用这个接口。 例如

但我没有这个接口的实现或生产者方法。相反,我正在寻找一种为这个接口注入通用代理的方法

我想,我需要像cdi这样的扩展来做这样的事情。不幸的是,我找不到任何好方法来解决这个问题。 在一个最优的世界里,我希望实现这样一种方法

public Object produce( Class< ? > type )
{
    if(isMyType(type))
    {
        // I can produce this type
        return createProxy(type);
    }
    return null; // this method can't produce this type
}
公共对象生成(类<?>类型)
{
if(isMyType(类型))
{
//我能生产这种型号的
返回createProxy(类型);
}
return null;//此方法无法生成此类型
}
有人知道怎么做吗

问候 约翰

所以,我终于得到了它。 对于我的用例,我需要一个CDI扩展来监听ProcessInjectionPoint和AfterBeanDiscovery。 ProcessInjectionPoint收集所有用于注入的相关接口,AfterBeanDiscovery为此接口创建bean

检查注入是否相关由带有@RMI的注释完成@RMI是自己的限定符注释。RMILifecyle负责构建或销毁注入的对象。 这里有一些源代码

public class RMIInjectionExtension implements Extension
{
    private Set< Class< ? > > interfaces = Sets.newHashSet();

    void processInjectionPoint( @Observes final ProcessInjectionPoint< ?, ? > aProcessInjectionPoint )
    {
        // collecting all relevant interfaces
        if( aProcessInjectionPoint.getInjectionPoint().getQualifiers().stream()
            .anyMatch( RMI.class::isInstance ) )
        {
            interfaces.add( (Class< ? >)aProcessInjectionPoint.getInjectionPoint().getType() );
        }
    }

    void afterBeanDiscovery( @Observes final AfterBeanDiscovery aAfterBeanDiscovery,
        BeanManager aBeanManager )
    {
        // create beans for the interfaces
        // using DeltaSpike BeanBuilder
        interfaces.stream().map( a -> new BeanBuilder< Object >( aBeanManager ).beanClass( a )
            .qualifiers( (RMI)() -> RMI.class ).beanLifecycle( new RMILifecyle() ).create() )
            .forEach( aAfterBeanDiscovery::addBean );
    }
}
公共类RMIInjectionExtension实现扩展
{
私有集合>接口=集合。newHashSet();
无效流程注入点(@观察最终流程注入点<?,?>流程注入点)
{
//收集所有相关接口
if(aProcessInjectionPoint.getInjectionPoint().getQualifiers().stream())
.anyMatch(RMI.class::isInstance))
{
添加((类<?>)一个进程injectionpoint.getInjectionPoint().getType());
}
}
在Beandiscovery之后无效(@在Beandiscovery之后观察最终的Beandiscovery A在Beandiscovery之后,
BeanManager(BeanManager)
{
//为接口创建bean
//使用DeltaSpike BeanBuilder
interfaces.stream().map(a->new BeanBuilder(aBeanManager).beanClass(a)
.qualifiers((RMI)(->RMI.class).beanLifecycle(新的RMILifecyle()).create())
.forEach(aAfterBeanDiscovery::addBean);
}
}


这对我来说非常有效。

看看这个:你能把这个再详细一点吗?如果接口没有实现,您希望注入什么?“代理”会做什么?您总是需要一些实际的实现,所以要么您实现它,要么其他库实现它。@Siliarus我的想法是java代理可以“伪造”这个接口。我的具体用例是在我的客户机中注入EJB RMI接口。对于不同的RMI接口,产品方法看起来总是非常相似的。请参阅LookUpremoteTestefulCounter()。我喜欢将特定接口所需的参数存储在propery文件中,并将其加载到代理中。
public Object produce( Class< ? > type )
{
    if(isMyType(type))
    {
        // I can produce this type
        return createProxy(type);
    }
    return null; // this method can't produce this type
}
public class RMIInjectionExtension implements Extension
{
    private Set< Class< ? > > interfaces = Sets.newHashSet();

    void processInjectionPoint( @Observes final ProcessInjectionPoint< ?, ? > aProcessInjectionPoint )
    {
        // collecting all relevant interfaces
        if( aProcessInjectionPoint.getInjectionPoint().getQualifiers().stream()
            .anyMatch( RMI.class::isInstance ) )
        {
            interfaces.add( (Class< ? >)aProcessInjectionPoint.getInjectionPoint().getType() );
        }
    }

    void afterBeanDiscovery( @Observes final AfterBeanDiscovery aAfterBeanDiscovery,
        BeanManager aBeanManager )
    {
        // create beans for the interfaces
        // using DeltaSpike BeanBuilder
        interfaces.stream().map( a -> new BeanBuilder< Object >( aBeanManager ).beanClass( a )
            .qualifiers( (RMI)() -> RMI.class ).beanLifecycle( new RMILifecyle() ).create() )
            .forEach( aAfterBeanDiscovery::addBean );
    }
}