首页 > 解决方案 > 弹簧靴 2 | 非常基本的依赖注入@Autowired问题

问题描述

Java Spring Boot 2 非常新。对于我确信这是一个非常愚蠢的问题提前道歉。

背景:对我来说,首先我需要看到和理解一个概念的非常纯粹和简单的实现,然后我才能开始推断这个概念或技术的效用。

因此,我试图设置一个防白痴的示例,显示@Autowired 和 DI '在工作',在继续之前我可以完全理解。

我试图建立一个只有两个类的超级简单的 Spring Boot 2 项目;1 个“TesterApplication”,其中包含 psvm 和2 个“用户”,这是一个非常简单的类,其中包含一个字段“名称”,没有 args 构造函数。见图片:

PSVM 在这里:

package com.tester.kryten.tester;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class TesterApplication {

    public static void main(String[] args) {

        System.out.println("1. Pre Spring Run");
        SpringApplication.run(TesterApplication.class, args);
        System.out.println("2. Post Spring Run");

        @Autowired
        Users user;
        System.out.println("3. " + user.getName());

    }
}

“用户”类在这里:

package com.tester.kryten.tester;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Users {

    public String name = "foo bar";

    @Autowired
    public Users() {
            System.out.println("User class constructor called");
        }

    public String getName() { return name; }

}

现在,我要做的就是了解在另一个类中引用和使用“User”的 Spring 托管实例的正确方法,在这个简单的示例中是 TesterApplication 类。

我正在阅读它是如何被使用的:

Users user = new User(); 

并且使用 Spring DI 来管理依赖关系更好,那么在这个例子中它是如何完成的呢?让我震惊的是,在 TesterApplication 类的第 20 行,我从 Intellij 获得了预期的代码完成,为我提供了 getName() 方法。这让我认为该实例必须在那里,但我只是得到:

错误:(17, 9) java: annotation type not applicable to this kind of declaration

那里的某个好心人可以让我摆脱痛苦并告诉我我在哪里误解了如何简单地将用户实例注入 TestApplication.class -正确的方式?请。

标签: javaspringspring-boot

解决方案


首先要了解的是@Component 注解的使用。当您在应用程序上下文启动期间将注释放在类上时,就像您的情况下的用户一样,用户类的构造函数通过创建用户对象并将其添加到 Spring IOC 容器来调用。要在另一个类中使用此对象,只需创建一个用户类型的属性并将@Autowired 注释放在此属性上,而不是在方法内。所以你可以在你的类的方法中使用这个属性。此外,您不需要将 @Autowired 注释放在 Users 类构造函数上。


推荐阅读