gpt4 book ai didi

java - Spring Autowire 检索错误的类

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:44:17 25 4
gpt4 key购买 nike

我有

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 我得到状态字段 dogsCats 我会得到

public class ClassA {
@Autowired
@Qualifier("dogs")
Dogs myDogEntity;
}

public class ClassB {
@Autowired
@Qualifier("cats")
Cats myCatEntity;
}

事实上,如果我打印MyStatus 的信息,我每次都会得到cats(或每次dogs)。我本来希望容器以不同方式启动并注入(inject)适当的实例。但事实并非如此。

有没有一种简单的方法来为不同的对象使用单独的容器而不是注入(inject)相同的容器?

更新 不幸的是,我的原始代码中有一些拼写错误。修复它们 - 希望所有。

我终于发现主要问题是 Spring 只创建了一个组件实例。在我的例子中 MyStatus。因此,这个实例被注入(inject)到其他类中。对这一类的任何操纵都会导致它操纵另一个类的副作用。

我的解决方案:将配置分成两部分 - 一部分与 Spring 相关,另一部分是实例,例如CatsDogs 将单独处理 - 无需 Spring(注入(inject))!!!

最佳答案

您的问题是,默认情况下,范围是 Spring 上的 Singleton,您最终在 Dogs 和 Cats 中拥有相同的 MyStatus 实例。

有一种简单的方法可以实现这一点,对于类 MyStatus,您可以将范围设置为原型(prototype):

@Data
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyStatus<T> {
public String test;
}

这样,您无需更改任何其他内容。因为 Spring 将为请求注入(inject)它的每个人创建一个新实例。

这样,Cats 和 Dogs 类将具有不同的 MyStatus 实例。

关于java - Spring Autowire 检索错误的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56581828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com