HK2依赖注入仅支持@Service/@Contract?如何添加@Singleton等注解支持
解决HK2依赖注入中@Singleton等注解不生效的问题
当前基于HK2的Jersey应用仅@Service和@Contract注解能正常实现依赖注入,但@Singleton等Scope注解无法生效,可通过以下两种方案解决:
方案一:配置元数据生成器支持Jakarta标准注解
HK2的hk2-metadata-generator默认仅识别自身原生注解,若要使用Jakarta规范的@Singleton、@Inject等注解,需修改Maven编译配置,让生成器扫描这些注解:
- 在
pom.xml中添加maven-compiler-plugin配置,指定注解处理器并开启JSR330支持:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <annotationProcessorPaths> <path> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-metadata-generator</artifactId> <version>3.0.2</version> </path> </annotationProcessorPaths> <compilerArgs> <!-- 开启JSR330注解支持,识别Jakarta的@Singleton等 --> <arg>-Aorg.glassfish.hk2.metadata.generator.includeJsr330=true</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
- 在DAO或服务类上同时使用
@Service和@Singleton注解:
import jakarta.inject.Singleton; import org.jvnet.hk2.annotations.Service; @Service @Singleton public class UserDao { // DAO业务逻辑 }
如果使用HK2原生的org.glassfish.hk2.api.Singleton注解,无需额外配置编译参数,直接配合@Service使用即可。
方案二:手动绑定服务与Scope
若不想修改编译配置,可通过自定义Binder手动指定服务的Scope:
- 创建自定义Binder类:
import org.glassfish.hk2.utilities.binding.AbstractBinder; import jakarta.inject.Singleton; public class CustomBinder extends AbstractBinder { @Override protected void configure() { // 绑定UserDao为Singleton实例 bind(UserDao.class).to(UserDao.class).in(Singleton.class); // 绑定实现类到接口并指定Scope bind(UserServiceImpl.class).to(UserService.class).in(Singleton.class); } }
- 在应用启动类中注册该Binder:
import org.glassfish.jersey.server.ResourceConfig; public class MyApplication extends ResourceConfig { public MyApplication() { register(MyResource.class); register(AutoScanFeature.class); register(new CustomBinder()); // 注册自定义绑定规则 } }
注意事项
- 确保
hk2-metadata-generator版本与HK2核心依赖版本一致(当前为3.0.2) - 手动绑定的服务优先级高于自动扫描的服务,若两者冲突,手动绑定规则会生效
内容的提问来源于stack exchange,提问作者reza ramezani matin
相关产品推荐
相关产品推荐

