java依赖注入inject_java – Jersey HK2依赖注入

您可以做的是创建自定义注释

@Target({ElementType.FIELD, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

public @interface Config {

String value();

}

然后为它创建一个InjectionResolver(允许使用自定义注释进行注入)

public static class ConfigInjectionResolver implements InjectionResolver {

private static final Map properties = new HashMap<>();

public ConfigInjectionResolver() {

properties.put("greeting.message", "Hello World");

}

@Override

public Object resolve(Injectee injectee, ServiceHandle> handle) {

if (String.class == injectee.getRequiredType()) {

AnnotatedElement elem = injectee.getParent();

if (elem instanceof Constructor) {

Constructor ctor = (Constructor) elem;

Config config = (Config) ctor.getParameterAnnotations()[injectee.getPosition()][0];

return properties.get(config.value());

} else {

Config config = elem.getAnnotation(Config.class);

return properties.get(config.value());

}

}

return null;

}

@Override

public boolean isConstructorParameterIndicator() { return true; }

@Override

public boolean isMethodParameterIndicator() { return false; }

}

这个例子只使用了Map,但我相信你可以弄清楚如何让它使用Properties.注册InjectionResolver后,您现在就可以了

public SomeService(@Config("some.property") String property) {}

这是一个完整的测试用例

import org.glassfish.hk2.api.Injectee;

import org.glassfish.hk2.api.InjectionResolver;

import org.glassfish.hk2.api.ServiceHandle;

import org.glassfish.hk2.api.TypeLiteral;

import org.glassfish.hk2.utilities.binding.AbstractBinder;

import org.glassfish.jersey.filter.LoggingFilter;

import org.glassfish.jersey.server.ResourceConfig;

import org.glassfish.jersey.test.JerseyTest;

import org.junit.Test;

import javax.inject.Inject;

import javax.inject.Singleton;

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.core.Response;

import java.lang.annotation.*;

import java.lang.reflect.AnnotatedElement;

import java.lang.reflect.Constructor;

import java.util.HashMap;

import java.util.Map;

import java.util.logging.Logger;

import static org.junit.Assert.*;

/**

* Run like any other JUnit Test. Only one required dependency

*

*

* org.glassfish.jersey.test-framework.providers

* jersey-test-framework-provider-grizzly2

* ${jersey2.version}

*

*

* @author Paul Samsotha

*/

public class ConfigExample extends JerseyTest {

@Target({ElementType.FIELD, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

public static @interface Config {

String value();

}

public static class ConfigInjectionResolver implements InjectionResolver {

private static final Map properties = new HashMap<>();

public ConfigInjectionResolver() {

properties.put("greeting.message", "Hello World");

}

@Override

public Object resolve(Injectee injectee, ServiceHandle> handle) {

if (String.class == injectee.getRequiredType()) {

AnnotatedElement elem = injectee.getParent();

if (elem instanceof Constructor) {

Constructor ctor = (Constructor) elem;

Config config = (Config) ctor.getParameterAnnotations()[injectee.getPosition()][0];

return properties.get(config.value());

} else {

Config config = elem.getAnnotation(Config.class);

return properties.get(config.value());

}

}

return null;

}

@Override

public boolean isConstructorParameterIndicator() { return true; }

@Override

public boolean isMethodParameterIndicator() { return false; }

}

private static interface GreetingService {

String getGreeting();

}

private static class ConfiguredGreetingService implements GreetingService {

private String message;

public ConfiguredGreetingService(@Config("greeting.message") String message) {

this.message = message;

}

@Override

public String getGreeting() {

return this.message;

}

}

@Path("greeting")

public static class GreetingResource {

@Inject

private GreetingService greetingService;

@GET

public String getConfigProp() {

return greetingService.getGreeting();

}

}

@Override

public ResourceConfig configure() {

ResourceConfig config = new ResourceConfig(GreetingResource.class);

config.register(new LoggingFilter(Logger.getAnonymousLogger(), true));

config.register(new AbstractBinder(){

@Override

protected void configure() {

bind(ConfiguredGreetingService.class).to(GreetingService.class).in(Singleton.class);

bind(ConfigInjectionResolver.class)

.to(new TypeLiteral>(){})

.in(Singleton.class);

}

});

return config;

}

@Test

public void should_get_configured_greeting() {

final Response response = target("greeting")

.request().get();

assertEquals("Hello World", response.readEntity(String.class));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值