繁体   English   中英

Spring Autowire检索错误的类

[英]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我得到状态领域dogsCats我会得到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相关的,一个是实例,例如CatsDogs将单独处理 - 没有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM