Java 工厂实例化组件中的依赖项注入

Java 工厂实例化组件中的依赖项注入,java,dependency-injection,seam,factory,seam2,Java,Dependency Injection,Seam,Factory,Seam2,有两个类,Foo和Bar,在我的Seam 2.2.2应用程序中实现了一些接口Baz。我试图建立一个Baz类型的组件,该组件有条件地使用这两个类中的一个实现。为此,我创建了一个工厂组件,BazFactory,根据implClassName字段的值,用Foo或Bar实例化Baz: public interface Baz {...} public class Foo implements Baz { @In String injectedValue1; ... } p

有两个类,
Foo
Bar
,在我的
Seam 2.2.2
应用程序中实现了一些接口
Baz
。我试图建立一个
Baz
类型的组件,该组件有条件地使用这两个类中的一个实现。为此,我创建了一个工厂组件,
BazFactory
,根据
implClassName
字段的值,用
Foo
Bar
实例化
Baz

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
实现多创建一个组件。因此,这个变通方法对我来说很难看。如果有解决上述依赖注入问题的方法,我更愿意使用第一种方法


有没有一种方法可以将依赖项注入工厂实例化的组件?

您可以用更简单的方法实现同样的事情。 在工厂中,不应使用Class.forName().newInstance()创建新实例

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

<bean id="bar" class="com.techidiocy.Bar"/>
<bean id="foo" class="com.techidiocy.Foo"/>
通过这种方式,您可以根据在factory类中接收的输入返回所需的实现类型


谢谢

如果我没有弄错的话,这个解决方案是针对Spring框架的。我的问题是指Seam框架2.2.2,而不是Spring。哦,对不起,我的问题是,它只针对Spring,我完全失去了它。我将删除我的答案谢谢你指出这一点。
ApplicationContext context = new ClassPathXmlApplicationContext
        ("classpath:context.xml");

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