[英]Spring Autowire retrieves the wrong class
我有
public abstract class AbstractClass<T> {
public abstract MyStatus getStatus();
public void test() {
System.out.println(getStatus().testField());
}
}
我有狗
@Component("dogs")
public class Dogs extends AbstractClass<Dogs>{
@Autowired
MyStatus statusField;
@PostConstruct
private void init() {
statusField.setTest("dogs");
}
public getStatus() {
return statusField;
}
}
我有猫
@Component("cats")
public class Cats extends AbstractClass<Cats>{
@Autowired
MyStatus statusField;
@PostConstruct
private void init() {
statusField.setTest("cats");
}
public getStatus() {
return statusField;
}
}
对于我有的StatusContainer
@Component
@Data
public class MyStatus<T> {
public String test; // and other options from the application.properties file
}
我希望,如果我@Autowired
Dogs
我得到状态领域dogs
和Cats
我会得到cats
。
public class ClassA {
@Autowired
@Qualifier("dogs")
Dogs myDogEntity;
}
public class ClassB {
@Autowired
@Qualifier("cats")
Cats myCatEntity;
}
事实上,如果我打印MyStatus
的信息,我每次MyStatus
得到cats
(或每次都是dogs
)。 我会发现容器以不同的方式启动并注入适当的实例。 但那不是真的。
是否有一种简单的方法可以为不同的物体提供separete容器而不是注入相同的物体?
更新不幸的是我的原始代码中有一些拼写错误。 修正了他们 - 希望所有人。
我终于发现主要问题是Spring只创建了一个组件实例。 在我的情况下MyStatus
。 因此,这一个实例被注入其他类。 对这一类的任何操纵都会导致它操纵另一类的副作用。
我的解决方案:将配置拆分为两个部分 - 一个是Spring相关的,一个是实例,例如Cats
或Dogs
将单独处理 - 没有Spring(注入)!
你的问题是,默认情况下,范围是Spring上的Singleton,你最终在Dogs和Cats中都有相同的MyStatus实例。
有一种简单的方法可以实现这一点,对于MyStatus类,您可以将范围设置为Prototype:
@Data
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyStatus<T> {
public String test;
}
这样,您无需更改任何其他内容。 因为Spring会为每个请求注入它的人创建一个新实例。
这样,Cats和Dogs类将具有不同的MyStatus实例。
您必须更新您的代码并更正打字错误,我在下面发布了更正。
public class ClassA {
@Autowired
@Qualifier("dogs")
Dogs myDogEntity;
}
public class ClassB {
@Autowired
@Qualifier("cats")
Cats myCatEntity;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.