0

有两个类,Foo和,在我的应用程序中Bar实现了一些接口。我正在尝试建立一个使用这两个类之一有条件地实现的类型的组件。为此,我创建了一个工厂组件,使用或依赖于字段值进行实例化:BazSeam 2.2.2BazBazFactoryBazFooBarimplClassName

public interface Baz {...}

public class Foo implements Baz {

    @In
    String injectedValue1;

    ...
}

public class Bar implements Baz {

    @In
    String injectedValue2;

    ...
}

@Name("bazFactory")
@Scope(value = ScopeType.SESSION)
public class BazFactory {

    private String implClassName;

    public void setImplClassName(String implClassName) {
        this.implClassName = implClassName;
    }

    @Factory(value="baz", scope = ScopeType.SESSION)
    public Baz getBazImpl() throws Exception {
        Class.forName(this.implClassName).newInstance();
    }
}

问题是在这种情况下,依赖项没有注入到实例化的类中。我设计的唯一解决方法是将Foo和声明Bar为组件:

@Name("foo")
@Scope(ScopeType.CONVERSATION)
public class Foo implements Baz {

    @In
    String injectedValue1;

    ...
}

@Name("bar")
@Scope(ScopeType.CONVERSATION)
public class Bar implements Baz {

    @In
    String injectedValue2;

    ...
}

@Name("bazFactory")
@Scope(value = ScopeType.SESSION)
public class BazFactory {

    private String implComponentName;

    public void setImplComponentName(String implComponentName) {
        this.implComponentName = implComponentName;
    }

    @Factory(value="baz", scope = ScopeType.SESSION)
    public Baz getBazImpl() {
        return (Baz) Component.getInstance(this.implComponentName);
    }
}

但是,在这种情况下,范围类型会很混乱。例如,如何定义@Scope(ScopeType.CONVERSATION)在其声明和scope = ScopeType.SESSION实例化该组件的工厂方法声明中的组件(如上面的示例)?此外,解决方法涉及为每个Baz实现再创建一个组件。因此,这种解决方法对我来说看起来很难看。如果有上述依赖注入问题的解决方案,我更喜欢使用第一种方式。

有没有办法将依赖项注入工厂实例化的组件?

4

1 回答 1

0

您可以以更简单的方式实现相同的目标。在您的工厂中,您不应使用 Class.forName().newInstance() 来创建新实例。

另一方面,在您的上下文文件中,您可以拥有像

<bean id="bar" class="com.techidiocy.Bar"/>
<bean id="foo" class="com.techidiocy.Foo"/>

假设: Bar 和 Foo 所需的属性将自动装配或手动注入。

在您的工厂中,您可以通过传递 bean 名称来加载此上下文文件并从中获取 bean,因为您已经在工厂中获取了它。

ApplicationContext context = new ClassPathXmlApplicationContext
        ("classpath:context.xml");

 return context.getBean(implClassName);//implClassName is the input that you are receiving in factory

通过这种方式,您可以返回所需的实现类型,具体取决于您在工厂类中收到的输入。

谢谢

于 2013-07-31T09:45:03.910 回答