以下是如何使用Java设置Pico Container:
public class Juicer {
private final Peelable peelable;
private final Peeler peeler;
public Juicer(Peelable peelable, Peeler peeler) {
this.peelable = peelable;
this.peeler = peeler;
}
}
配置:
MutablePicoContainer pico = new DefaultPicoContainer();
pico.addComponent(Apple.class); /* Apple is peelable */
pico.addComponent(Juicer.class);
pico.addComponent(Peeler.class);
使用!
Juicer juicer = (Juicer) pico.getComponent(Juicer.class);
在这种情况下,榨汁机将创建自己的Apple和Peeler。
这与node-di
的工作方式完全相反。 node-di将创建一个对象,然后对其进行缓存并继续使用它 - 因此它对资源管理(例如一个连接池)更好。
我不明白该怎么做才能实例化它,例如Apple类更具动态性。也许它的构造函数是Apple(BigDecimal price)
,当它被实例化时,我需要通过价格。更现实的是,我有十万用户在一台机器上连接,每台用户都有不同的PasswordAuthenticator
。如果需要为每个用户提供具有不同参数的不同参考,那么PasswordAuthenticator
如何来自IoC框架?
使用PasswordAuthenticator
与IoC但没有框架是:
User.java:
// constructor
public User(String email, PasswordAuthenticator pa) {
this.email = email;
this.pa = pa;
PasswordAuthenticator.java:
public PasswordAuthenticator(byte[] privateKey, byte[] encryptedPassword) {
// set instance variables
}
public String decrypt() {
// crypto magic
return decryptedPassword;
}
当然,您实例化的用户如下:
User user = new User("abc@gmail.com", new PasswordAuthenticator(myKey, sqlResultSet.getBytes());
// sqlResultSet is for emphasis; to emphasize this is dynamic on a per-user basis
现在我必须告诉容器它实际上不能实例化PasswordAuthenticator的willy-nilly,但它只能在动态传递参数时才这样做。
node-di是我的目标用例,因此我将标记为java和node。显然,我试图通过类比学习,并且在IoC框架可以实际解决的问题范围内。