Java 手动创建实例时如何使@autowire在spring中工作

Java 手动创建实例时如何使@autowire在spring中工作,java,spring,autowired,Java,Spring,Autowired,我有一个java接口,比如说ITest由两个类Class1和Class2实现。现在我有了一个工厂类,我用它来决定返回哪个实现。像 if(something) return new Class1() else return new Class2() 问题是,我在Class1中有一个未实例化的autowired字段,但在通过autowiring实例化的其他类中,相同的autowiring也可以工作 下面是Class1的代码 @Componene public Class1 imple


我有一个java接口,比如说ITest由两个类Class1和Class2实现。现在我有了一个工厂类,我用它来决定返回哪个实现。像

if(something)
    return new Class1()
else
   return new Class2()
问题是,我在Class1中有一个未实例化的autowired字段,但在通过autowiring实例化的其他类中,相同的autowiring也可以工作
下面是Class1的代码

@Componene
public Class1 implements ITest{
  @Autowired
  private SomeClass obj;
}

我不知道如何解决这个问题。因为某些类的自动连接在其他类中可以正常工作。

在factory类中插入applicationContext并将其用于bean创建:

@Autowired private ApplicationContext applicationContext;
......
......
         if(something){
            return applicationContext.getBean("com.xyz.Class1");
         }
......
......

或者您可以在Class1和Class2上使用
@可配置的
。这需要启用AspectJ编织。然后,当您使用new时,Spring将神奇地创建bean。

您可以使用带有@springbootplication或@Configuration注释的主配置类

例如:

@SpringBootApplication
public class YourApp {

   public static void main(String[] args) {
       SpringApplication.run(YourApp.class, args);
   }

   @Autowired
   private CsvBeanRepository repo;

   @Bean
   public InterfaceSome some() {
       if(something) {
           return new Some(repo);
       } else {
           return new Some2(repo);
       }
   }
}

在@SpringBootApplication类或@Configuration类中,您可以正常地@Autowire您的类,并将它们用作工厂的参数。

这在很大程度上取决于您需要什么,但您可以:

  • 将工厂返回的对象定义为原型范围,并将其注入singleton,有关更多详细信息,请参阅:
  • 然后整个魔法就在春天完成了

  • 如果您只想在两个不同的无状态实现之间切换,您可以将它们都注入工厂并返回一个现有bean

    @Compoment class Factory { 
    
      @Autowired 
      Class1 class1Instance;
    
      @Autowired 
      Class2 classInstance;
      ...
      if(something)
        return class1Instance;
      else
       return class2Instance;
      ...
    }
    
    }

  • 但是请确保两个注入的类都没有状态

  • 使工厂由Spring管理,这两个类都不由Spring管理,并手动注入依赖项:

    public Class1 implements ITest{
    
      private SomeClass obj;
    
      public Class1(SomeClass obj) {
            this.obj=obj;}
    }
    
  • 在工厂:

      @Autowired
      private SomeClass obj;
       ...
       if(something)
         return new Class1(obj);
       else
        return new Class2(obj);
    

    乍一看似乎很奇怪,通过这种方式,您可以分离域和应用程序/基础架构部分。

    我建议在这种情况下使用@value注释

    范例

    我的班级{

    Object getObjectFromFactory()
    {
      if(something)
        return new Class1()
     else
        return new Class2()
    }
    
    }

    然后您可以像下面那样使用它

    @值(“#{MyClass.getObjectFromFactory}”)


    私有对象myObject

    如果您自己实例化对象,则无法自动关联对象。我该如何解决这个问题?我的工厂类需要根据特定条件返回实例。因此,我必须手动实例化,您可以做的是,在Spring配置中,创建与不同的
    类相对应的
    @Bean
    ,通过setter或构造函数在其中注入
    SomeClass
    对象。这样,您就不会在工厂中制造新的产品,而是在工厂中自动连接
    类。不过,我有点不鼓励这样做,因为这不是干净的代码。在使用spring:)时使用
    new
    是一种犯罪行为。话虽如此,尝试
    原型