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

hk2: why bind(X.class).to(X.class)

我正在学习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);
    }
}

谢谢

您正在配置希望如何在 DI(依赖项注入)系统中发现您的服务。 bind(Service).to(Contract) 基本上是说您想提供 Service 作为可注入服务,并希望 "advertise" 它作为 Contract。通过 "advertise",我的意思是您希望能够将其注入的内容。例如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 实例。

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

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

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

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