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