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和Jersey(带/不带抽象绑定)进行依赖项注入_Java_Tomcat_Dependency Injection_Jersey_Cdi - Fatal编程技术网

Java 使用CDI和Jersey(带/不带抽象绑定)进行依赖项注入

Java 使用CDI和Jersey(带/不带抽象绑定)进行依赖项注入,java,tomcat,dependency-injection,jersey,cdi,Java,Tomcat,Dependency Injection,Jersey,Cdi,首先,这不是一个固执己见的问题,我在SO中阅读了大部分相关问题。我正在寻求以下实施的解决方案是否是正确的方法/方法的建议 我已经阅读了很多关于如何在基于jersey的webapp中实现DI的教程,其中大多数都建议必须在WEB-INF/*中创建一个beans.xml,以启用CDI,但是,我想知道使用jersey的AbstractBinder是否也能达到同样的效果 我有一个jersey webapp,在web.xml <servlet> <servlet-name&

首先,这不是一个固执己见的问题,我在SO中阅读了大部分相关问题。我正在寻求以下实施的解决方案是否是正确的方法/方法的建议

我已经阅读了很多关于如何在基于jersey的webapp中实现DI的教程,其中大多数都建议必须在
WEB-INF/*
中创建一个
beans.xml
,以启用CDI,但是,我想知道使用jersey的
AbstractBinder
是否也能达到同样的效果

我有一个jersey webapp,在
web.xml

    <servlet>
    <servlet-name>Test Jersey</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.test.config.AppConfig</param-value>
    </init-param>
然后我对接口进行注释,然后注入实现

@Inject 
private SomeInterface someInterface; 
上面的工作很好。无论我想要注入什么,我都会将它包含在
活页夹中,然后指定一个
注入点,它就会被注入

WEB-INF/
目录中没有
beans.xml
,我想知道是否在
AppConfig
中使用
AbstractBinder
来扩展
ResourceConfig
就不需要声明
beans.xml

当我们使用
@Component
@ManagedBean
注释类时,添加
beans.xml
可能会启用类扫描,从而为DI铺平道路

不管怎样,我很高兴听到你的反馈/建议/建议/建议

  • 坚持使用泽西岛DI的现有解决方案(如上所示),因为
  • 切换到注释类(需要注入)并使用
    beans.xml的注释发现,因为
    
  • 泽西岛默认使用
    HK2
    ,是否值得使用不同的DI 集装箱还是HK2足够好
  • 与JavaEE6相比,您对Jersey的SpringDI有什么看法 CDI仅用于DI目的

  • 有很多教程说明Tomcat不支持CDI?但是上面使用的是
    AbstractBinder
    ,我想这是因为我是通过编程绑定的?任何评论。

    我没有明确的答案,可能也没有正确的答案。不仅仅是因为,这当然不是没有任何理由的。但我想尝试一下:

  • 所示的解决方案适用于非复杂的项目结构,但声明每个绑定可能不是最佳解决方案
  • 您不需要使用
    beans.xml
    。注释和自动绑定只需一些额外的努力就可以很好地工作(见下文)
  • 我不确定这一点,但我会说焊接似乎更先进。当然,您可以通过一些努力来混合CDI
  • (这里没有回答)
  • 下面是一个我认为很有趣的例子:

    依赖项(Maven):

    合同:

    import org.jvnet.hk2.annotations.Contract;
    
    @Contract
    public interface ExampleService {
        void executeSomething();
    }
    
    一个或多个服务:

    import javax.inject.Named;
    import org.jvnet.hk2.annotations.Service;
    
    @Service
    @Named("bar")
    public class BarService implements ExampleService {
    
        @Override
        public void executeSomething() { /* doBar */ }
    
    }
    
    用法:

    @Path("/")
    public class TestResource {
    
        // either ...
        @Inject
        @Named("bar")
        private ExampleService bar;
    
        // or ...
        @Inject
        private IterableProvider<ExampleService> services;
    
    }
    
    @Path(“/”)
    公共类测试资源{
    //要么。。。
    @注入
    @命名(“酒吧”)
    私人酒吧;
    //或者。。。
    @注入
    私人IT提供商服务;
    }
    
    只是一个摆脱
    beans.xml
    (我从未使用或见过)或
    ResourceConfig
    中声明的选项,但它可能会找到感兴趣的人:)

    此外,它似乎正在发生^^

    祝你今天愉快

    import org.jvnet.hk2.annotations.Contract;
    
    @Contract
    public interface ExampleService {
        void executeSomething();
    }
    
    import javax.inject.Named;
    import org.jvnet.hk2.annotations.Service;
    
    @Service
    @Named("bar")
    public class BarService implements ExampleService {
    
        @Override
        public void executeSomething() { /* doBar */ }
    
    }
    
    @Path("/")
    public class TestResource {
    
        // either ...
        @Inject
        @Named("bar")
        private ExampleService bar;
    
        // or ...
        @Inject
        private IterableProvider<ExampleService> services;
    
    }