You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HK2依赖注入仅支持@Service/@Contract?如何添加@Singleton等注解支持

解决HK2依赖注入中@Singleton等注解不生效的问题

当前基于HK2的Jersey应用仅@Service和@Contract注解能正常实现依赖注入,但@Singleton等Scope注解无法生效,可通过以下两种方案解决:

方案一:配置元数据生成器支持Jakarta标准注解

HK2的hk2-metadata-generator默认仅识别自身原生注解,若要使用Jakarta规范的@Singleton、@Inject等注解,需修改Maven编译配置,让生成器扫描这些注解:

  1. 在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>
  1. 在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:

  1. 创建自定义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);
    }
}
  1. 在应用启动类中注册该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:00:59