Spring Autowire 检索错误class
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
的信息,我每次 cats
(或每次 dogs
)都会得到。我本来希望容器以不同方式启动并注入适当的实例。但事实并非如此。
有没有一种简单的方法来为不同的对象使用单独的容器而不是注入相同的容器?
UPDATE 不幸的是,我的原始代码中有一些拼写错误。已修复它们 - 希望全部修复。
我终于弄明白 is/was 的主要问题 Spring 只创建了一个组件实例。就我而言 MyStatus
。因此,这个实例被注入到其他 classes 中。对这一个 class 的任何操纵都会导致它操纵另一个的副作用。
我的解决方案:将配置分成两部分 - 一部分与 Spring 相关,另一部分是实例,例如Cats
或 Dogs
将单独处理 - 没有 Spring(注入)!!!
您必须更新您的代码并更正输入错误,我已在下面发布更正。
public class ClassA {
@Autowired
@Qualifier("dogs")
Dogs myDogEntity;
}
public class ClassB {
@Autowired
@Qualifier("cats")
Cats myCatEntity;
}
您的问题是,默认情况下,范围是 Spring 上的 Singleton,您最终在 Dogs 和 Cats 中拥有相同的 MyStatus 实例。
有一个简单的方法可以实现,对于class MyStatus,您可以将范围设置为原型:
@Data
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyStatus<T> {
public String test;
}
这样,您不需要更改任何其他内容。因为 Spring 将为请求注入它的每个人创建一个新实例。
这样,classes Cats 和 Dogs 将具有不同的 MyStatus 实例。
我有
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
的信息,我每次 cats
(或每次 dogs
)都会得到。我本来希望容器以不同方式启动并注入适当的实例。但事实并非如此。
有没有一种简单的方法来为不同的对象使用单独的容器而不是注入相同的容器?
UPDATE 不幸的是,我的原始代码中有一些拼写错误。已修复它们 - 希望全部修复。
我终于弄明白 is/was 的主要问题 Spring 只创建了一个组件实例。就我而言 MyStatus
。因此,这个实例被注入到其他 classes 中。对这一个 class 的任何操纵都会导致它操纵另一个的副作用。
我的解决方案:将配置分成两部分 - 一部分与 Spring 相关,另一部分是实例,例如Cats
或 Dogs
将单独处理 - 没有 Spring(注入)!!!
您必须更新您的代码并更正输入错误,我已在下面发布更正。
public class ClassA {
@Autowired
@Qualifier("dogs")
Dogs myDogEntity;
}
public class ClassB {
@Autowired
@Qualifier("cats")
Cats myCatEntity;
}
您的问题是,默认情况下,范围是 Spring 上的 Singleton,您最终在 Dogs 和 Cats 中拥有相同的 MyStatus 实例。
有一个简单的方法可以实现,对于class MyStatus,您可以将范围设置为原型:
@Data
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyStatus<T> {
public String test;
}
这样,您不需要更改任何其他内容。因为 Spring 将为请求注入它的每个人创建一个新实例。
这样,classes Cats 和 Dogs 将具有不同的 MyStatus 实例。