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您的类,并将它们用作工厂的参数。这在很大程度上取决于您需要什么,但您可以:
@Compoment class Factory {
@Autowired
Class1 class1Instance;
@Autowired
Class2 classInstance;
...
if(something)
return class1Instance;
else
return class2Instance;
...
}
}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
是一种犯罪行为。话虽如此,尝试原型