hk2:为什么绑定(X.class).to(X.class)

时间:2017-10-25 17:51:57

标签: dependency-injection jersey-2.0 hk2

我正在学习Java,但发现了以下代码。我很迷惑。什么是bind(X.class).to(X.class);

import org.glassfish.hk2.utilities.binding.AbstractBinder;
public class ApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(X.class).to(X.class);
    }
}

由于

2 个答案:

答案 0 :(得分:2)

您正在配置您希望在DI(依赖注入)系统中发现服务的方式。 bind(Service).to(Contract)基本上是说您希望将Service作为可注射服务提供,并希望将其“宣传”为Contract。通过“广告”,我的意思是你希望能够注入它。例如,Service可以是UserRepositoryImpl,而Contract可以是UserRepository(接口)。有了这个,你只能@Inject UserRepository,就像你宣传的一样。这样做的好处是programming to an interface带来的所有好处。

interface UserRepository {
    List<User> findAll();
}

class UserRepositoryImpl implements UserRepository {
    @Override
    public List<User> findAll() {
        return Arrays.asList(new User("username"));
    }
}

@Path("users")
class UserResource {
    @Inject
    private UserRepository repository;

    @GET
    public List<User> getUsers() {
        return repository.findAll();
    }
}

class JerseyApp extends ResourceConfig {
    public JerseyApp() {
        register(UserResource.class);
        register(new AbstractBinder() {
            @Override
            public void configure() {
                bind(UserRepositoryImpl.class)
                    .to(UserRepository.class);
            }
        });
    }
}

此处UserRepository被注入UserResource。当DI系统注入它时,它实际上是UserRepositoryImpl实例。

答案 1 :(得分:0)

这样做实际上是将新合同绑定到服务。

bind(Service.class).to(Contract.class);

OR(将新合同绑定到Singleton中的服务)

bind(Service.class).to(Contract.class)..in(Singleton.class);