SpringBoot @AutoWired Null


在調用工具類時,若工具類中含有@Autowired注解,這此工具類對象必須同樣使用@Autowired注解,否則工具類中的Spring注入的對象都為空值,這里的HadoopTest就是這樣

比如MyConfig類是

配置層
@Component
@ConfigurationProperties(prefix = "project")
public class MyConfig {
    private String version;
    private String name;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


HadoopTest類引用了MyConfig
public class HadoopTest {

    @Autowired
    MyConfig myConfig; //這里用了注入,所以controller層的test類中  HadoopTest hadoopTest=new HadoopTest();是無效的

    public void getName() {
        System.out.println(myConfig.getName());
    }

}

Controller中
@RestController
public class test {
    HadoopTest hadoopTest=new HadoopTest();

    @GetMapping("hello")
    public void hello() {
        hadoopTest.getName();
    }
}

這樣在System.out.println(myConfig.getName());中是找不到myconfig的,我們應該改成

配置層
@Component
@ConfigurationProperties(prefix = "project")
public class MyConfig {
    private String version;
    private String name;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


HadoopTest類引用了MyConfig
@Component
public class HadoopTest {

    @Autowired
    MyConfig myConfig;

    public void getName() {
        System.out.println(myConfig.getName());
    }

}

Controller類中
@RestController
public class test {
   @Autowired
    HadoopTest hadoopTest;

    @GetMapping("hello")
    public void hello() {
        hadoopTest.getName();
    }
}

或者是

配置層
@Compoment
@ConfigurationProperties(prefix = "project")
public class MyConfig {
    private String version;
    private String name;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

HadoopTest類引用了MyConfig
public class HadoopTest {

    MyConfig myConfig=new Myconfig;

    public void getName() {
        System.out.println(myConfig.getName());
    }

}

Controller類中
@RestController
public class test {
    HadoopTest hadoopTest=new HadoopTest();

    @GetMapping("hello")
    public void hello() {
        hadoopTest.getName();
    }
}

也就是一條邏輯線上,HadoopTest注入了MyConfig,那么在test中必須也是注入而不是new,原因以后在補充。
補充:1.在第三種情況中,雖然MyConfig被注釋了,但是只要不去注入它就沒關系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM