当前位置: 首页 > 知识库问答 >
问题:

需要实例化的类的Spring@Autowire属性

蓬意致
2023-03-14
public class Player {
   @Autowired gameService

   @Getter @Setter String name;

   public Player(String name) {
      this.name = name
   }

   public doSomething() {
      gameService.something() // gameService is null!
   }

}
@Service 
class GameService { public void something() {...} }

如果我要做新球员(“约翰”)。doSomething()java抱怨这一点。gameService为null。需要实例化Player类。

是否可以使gameService自动连接到服务正确?

共有3个答案

皇甫通
2023-03-14

由于您希望gameService自动连线,我相信您希望基于该gameService上的Player对象进行一些处理。如果是,请不要调用gameService。something(),调用gameService。某物(播放器)。

以下是一个可能的解决方案:

@Component
public class Player {
    @Autowired GameService gameService;

    @Getter
    @Setter
    String name;

    public Player() {
    }

    public Player(String name) {
        this.name = name;
    }

    public void doSomething(Player player) {
        gameService.something(player);
    }
}

然而,在调用方方面,它应该类似于:

@Autowired
Player player;
...

public void callPlayer() {
   Player johnPlayer = new Player("John");
   player.doSomething(johnPlayer);
}

这样做的原因是让spring创建播放器组件并进行依赖项注入,然后利用spring创建的组件。

希望这会有帮助。

华展鹏
2023-03-14

您可以将Player设置为一个使自动布线可用的组件:

@Component
public class Player {
   @Autowired 
   GameService gameService

此外,依赖注入最佳实践是使用基于构造函数的注入:

@Component
public class Player {
   private final GameService gameService;
   
   @Autowired
   public Player(GameService gameService){
      this.gameService = gameService;
   }
柯河
2023-03-14

如果我要做新玩家(“约翰”). doThings()

当您自己创建java实例时,Spring框架不知道这个实例。因此Spring不会用它包含的任何依赖项来丰富它。

要让您的类通过@Autow的包含依赖项,您必须让Spring创建此实例。Spring实际上会创建您提供的类的代理,而不是您编写的实际类。实现这一点的一种方法是将您的类Player标记为@Component,然后您还必须从Spring框架中检索实例播放器以正确包含它的依赖项。

请记住,在默认情况下,播放器将成为spring的一个单件,这与我看到的这个类的逻辑用途不完全匹配。要么你想让它成为一个原型,要么甚至更好,我认为你必须将游戏服务的使用转移到玩家类之外。

也许您可以让GameService中的方法某事()Player作为参数并做同样的事情。然后您可以在任何地方自动装配gameService,听起来它应该是一个单例。

 类似资料:
  • 假设我有以下代码: 是否有可能在中调用来自的的编译器错误?我知道实际上你会把那个方法放在构造函数中,但这个问题是出于好奇。

  • ConfigServiceDAO.java ConfigServiceDAO中的DAOBuilder始终为null,这是有道理的,因为我的理解是,当类被手动实例化时,spring注入不会发生。如果我希望将ConfigServiceDAO保留为非spring组件,那么这里的解决方案是什么? ====Edit=====我知道可以将ConfigServiceDAO作为一个spring组件,并autowi

  • 在另一个项目中实现之前,我一直试图按照这里的教程设置演示,以帮助我理解本地机器上的SSO。我遇到了一个使我陷入困境的问题。我收到错误通知我添加一个bean。请让我知道我缺少了什么代码。我无法使程序运行。 文件系统树 authApplication.java 应用程序.属性 给出错误(不是运行的全部控制台输出,但这是错误)

  • 一个好的实践是将服务定义为接口并在类上实现它。 假设我有两个实现相同接口的类,我想根据属性(而不是概要文件)来区分它们。我的意思是,如果我有Autowire private MyServiceInterface myService如果我有myproperty=potato,我想接收PotatoServiceImpl的实例;如果我有myproperty=tomato,我想接收TomatoServic

  • 问题内容: 在Json.NET中,如何进行反序列化时需要的所有属性?我知道我可以使用消息中的属性来执行此操作,但是我不想这样做。主要是因为这将要求我的消息库具有外部依赖关系。 我尝试了MissingMemberHandling.Error设置,但它与我想要的相反。我对具有额外属性的JSON表示满意。当JSON中缺少任何目标对象属性时,我希望它失败。 我实际上是反序列化为F#记录,并且这些属性通常不

  • 5.4. 类的实例化 5.4.1. 垃圾回收 在 Python 中对类进行实例化很直接。为了对类进行实例化,只要调用类,好象它是一个函数,传入定义在 __init__ 方法中的参数。返回值将是新创建的对象。 例 5.7. 创建 FileInfo 实例 >>> import fileinfo >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")