Java Spring Autowire检索错误的类

Java Spring Autowire检索错误的类,java,spring-boot,autowired,Java,Spring Boot,Autowired,我有 事实上,如果我打印MyStatus的信息,每次cats(或每次dogs)我都会收到。我会解释容器是以不同的方式启动的,并注入适当的实例。但事实并非如此 有没有一种简单的方法可以为不同的对象使用单独的容器,而不是注入相同的容器 更新不幸的是,我的原始代码中有一些拼写错误。修复了它们-希望全部修复 我最终发现主要的问题是Spring只创建一个组件实例。在我的例子中,MyStatus。因此,这一个实例被注入到其他类中。对这一类的任何操作都会导致它对另一个类进行操作的副作用 我的解决方案:将配置分

我有

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

有没有一种简单的方法可以为不同的对象使用单独的容器,而不是注入相同的容器

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

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


我的解决方案:将配置分为两部分-一部分与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实例

有一种简单的方法可以实现这一点,对于类MyStatus,您可以将作用域设置为Prototype:

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

public class ClassB {
   @Autowired
   @Qualifier("cats")
   Cats myCatEntity;
}
@数据
@组成部分
@范围(值=ConfigurableBeanFactory.Scope\u原型)
公共类MyStatus{
公共字符串测试;
}
这样,你就不需要再做任何改变了。因为Spring将为每个请求注入它的人创建一个新实例


这样,猫和狗类将有不同的MyStatus实例。

因为
typo
是我的朋友:-/更正了帖子你的意思是
@Qualifier(“狗”)
@Qualifier(“猫”)
,对吗?是的,对-只是另一个
typo
:-(…请参阅其他正确的注释Leo,因为默认情况下作用域为Singleton,每个组件只创建一个实例。另一种方法是在Dogs and cats内部,您不注入MyStatus,而是手动创建不稳定,因此最终会得到不同的实例。MyStatus看起来像一个模型,而不是一个组件。Hi@Brother;-)由于我需要
MyStatus
中的属性以及Spring中的属性,所以我最终导致了一次拆分(如上所述).你提到了
模型
Spring提供了什么吗?环顾四周后,我没有发现太多。只是出于好奇。那只是一个
打字错误
-不幸的是,它没有解决我的问题。我可以看到现在编辑的帖子。如果问题得到解决,那么它应该在答案部分,而不是问题部分
我的解决方案
这样其他人也可以以适当的方式找到解决方案。另外,我让as公开测试;因为您的示例是这样的,但是因为您有lombok,所以它应该是私有的。谢谢。
@Component("cats")
public class Cats extends AbstractClass<Cats>{
   @Autowired
   MyStatus statusField;

   @PostConstruct
   private void init() {
      statusField.setTest("cats");
   }

   public getStatus() {
     return statusField;
   }
}
@Component
@Data
public class MyStatus<T> {
   public String test; // and other options from the application.properties file
}
public class ClassA {
   @Autowired
   @Qualifier("dogs")
   Dogs myDogEntity;
}

public class ClassB {
   @Autowired
   @Qualifier("cats")
   Cats myCatEntity;
}
public class ClassA {
   @Autowired
   @Qualifier("dogs")
   Dogs myDogEntity;
}

public class ClassB {
   @Autowired
   @Qualifier("cats")
   Cats myCatEntity;
}
@Data
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyStatus<T> {
   public String test; 
}