Java 使用CDI和Jersey(带/不带抽象绑定)进行依赖项注入
首先,这不是一个固执己见的问题,我在SO中阅读了大部分相关问题。我正在寻求以下实施的解决方案是否是正确的方法/方法的建议 我已经阅读了很多关于如何在基于jersey的webapp中实现DI的教程,其中大多数都建议必须在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&
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;
}