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