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;
}