依赖
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2</artifactId>
<version>3.0.3</version>
</dependency>
<!--用于注册配置-->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.10.2</version>
</dependency>
服务
接口
package codeTemplate.hk2.service;
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface MyService {
void hello();
}
实现
实现一
package codeTemplate.hk2.service;
import org.jvnet.hk2.annotations.Service;
@Service
public class ResService implements MyService{
public String getAResService() {
return "A";
}
public String getBResService() {
return "B";
}
@Override
public void hello() {
System.out.println("ResService");
}
}
实现二
package codeTemplate.hk2.service;
import com.google.common.collect.ImmutableMap;
import jakarta.inject.Inject;
import org.jvnet.hk2.annotations.Service;
import java.util.Map;
@Service
public class HttpService implements MyService{
@Inject
private ResService resService;
public Map<String, String> getAllHttpService() {
System.out.println(resService.getAResService());
return ImmutableMap.of("A", resService.getAResService(), "B", resService.getBResService());
}
@Override
public void hello() {
System.out.println("HttpService");
}
}
启动类
package codeTemplate.hk2;
import codeTemplate.hk2.service.HttpService;
import jakarta.inject.Singleton;
import org.glassfish.hk2.api.*;
import org.glassfish.hk2.utilities.BuilderHelper;
import org.reflections.Reflections;
import java.util.Set;
public class Hk2Demo{
public static void main(String[] args) {
//创建一个服务加载器
ServiceLocator serviceLocator = ServiceLocatorFactory.getInstance().create("template-hk2");
//初始化配置
initConfig(serviceLocator);
//执行业务
HttpService httpService = serviceLocator.getService(HttpService.class);
System.out.println(httpService.getAllHttpService());
}
private static void initConfig(ServiceLocator serviceLocator) {
Reflections reflections = new Reflections("codeTemplate.hk2");
Set<Class<?>> serviceClasses = reflections.getTypesAnnotatedWith(org.jvnet.hk2.annotations.Service.class);
System.out.println(serviceClasses);
Set<Class<?>> contractClasses = reflections.getTypesAnnotatedWith(org.jvnet.hk2.annotations.Contract.class);
System.out.println(contractClasses);
DynamicConfigurationService dcs = serviceLocator.getService(DynamicConfigurationService.class);
DynamicConfiguration config = dcs.createDynamicConfiguration();
for(Class<?> serviceClass:serviceClasses){
Class<?> linkTo = serviceClass;
for (Class<?> contractClass : contractClasses) {
if(contractClass.isAssignableFrom(serviceClass) && contractClass.isInterface() ){
linkTo = contractClass;
break;
}
}
config.bind( BuilderHelper.link(serviceClass).to(linkTo).in(Singleton.class).build() );
}
config.commit();
}
}