IoC框架可以使用动态构造函数参数创建对象吗?

时间:2014-07-09 19:09:39

标签: java node.js inversion-of-control

以下是如何使用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框架可以实际解决的问题范围内。

0 个答案:

没有答案